ü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等的更多准备工作,请参阅“完整面试准备课程” 。