📜  C++中的用户定义字面量

📅  最后修改于: 2021-05-30 13:11:26             🧑  作者: Mango

üSER d efined大号iterals(UDL)的下加入++从C++ 11。虽然,C++为各种内置类型提供了字面量,但是它们是有限的。

内置类型的字面量示例:

// Examples of classical literals for built-in types.
42    // int
2.4    // double
3.2F    // float
'w'    // char
32ULL    // Unsigned long long
0xD0    // Hexadecimal unsigned
"cd"    // C-style string(const char[3]")

为什么我们使用UDL?
让我们考虑以下示例,以了解UDL的需求。

long double Weight = 2.3; //  pounds? kilograms? grams?

// With UDL, we attach units to the values which has
// following advantages
// 1) The code becomes readable.
// 2) Conversion computations are done at compile time. 
weight = 2.3kg;
ratio = 2.3kg/1.2lb;

要计算上述比率,必须将它们转换为相同的单位。 UDL帮助我们克服了单位翻译成本。我们可以为用户定义类型定义用户定义字面量,并为内置类型定义新形式的字面量。它们有助于使代码中的常量更具可读性。在编译时,编译器会将UDL的值替换为代码中定义的实际值。 UDL不会节省太多的编码时间,但是可以将越来越多的计算转移到编译时以加快执行速度。

用户定义字面量的示例:

"hello"s            // string
4.3i                // imaginary
101000111101001b    // binary
53h                // hours
234093270497230409328432840923849 // extended-precision

UDL被视为对字面量运算符的调用。仅支持后缀形式。字面量运算符的名称为运算运算符“”,后跟后缀。

范例1:

// C++ code to demonstrate working of user defined
// literals (UDLs)
#include
#include
using namespace std;
  
// user defined literals
  
// KiloGram
long double operator"" _kg( long double x )
{
    return x*1000;
}
  
// Gram
long double operator"" _g( long double x )
{
    return x;
}
  
// MiliGram
long double operator"" _mg( long double x )
{
    return x / 1000;
}
  
// Driver code
int main()
{
    long double weight = 3.6_kg;
    cout << weight << endl;
    cout << setprecision(8) << ( weight + 2.3_mg ) << endl;
    cout << ( 32.3_kg / 2.0_g ) << endl;
    cout << ( 32.3_mg *2.0_g ) << endl;
    return 0;
}
输出:
3600
3600.0023
16150
0.0646

范例2:

#include 
#include 
using namespace std;
  
// imaginary literal
constexpr complex  operator"" _i( long double d )
{
    return complex  { 0.0 , static_cast  ( d ) };
}
  
int main()
{
    complex  z = 3.0 + 4.0_i;
    complex  y = 2.3 + 5.0_i;
    cout << "z + y = " << z+y << endl;
    cout << "z * y = " << z*y << endl;
    cout << "abs(z) = " << abs(z) << endl;
    return 0;
}
输出:
z + y = (5.3,9)
z * y = (-13.1,24.2)
abs(z) = 5

在这里,constexpr用于启用编译时间评估。

限制:
UDL只能使用以下参数:

char const*
unsigned long long
long double
char const*, std::size_t
wchar_t const*, std::size_t
char16_t const*, std::size_t
char32_t const*, std::size_t

但是返回值可以是任何类型。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”