C++中的自定义文字 (UDL)

用户定义文字(UDL)是从C++ 11开始的C++中添加的。虽然,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被视为对文字运算符的调用。只支持后缀形式。文字运算符的名称是operator“”,后跟后缀。

范例1

// C++ code to demonstrate working of user defined 
// literals (UDLs) 
#include<iostream> 
#include<iomanip> 
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 <iostream> 
#include <complex> 
using namespace std; 
  
// imaginary literal 
constexpr complex <double> operator"" _i( long double d ) 
{ 
    return complex <double> { 0.0 , static_cast <double> ( d ) }; 
} 
  
int main() 
{ 
    complex <double> z = 3.0 + 4.0_i; 
    complex <double> 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

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

六一编程网

发表评论

Next Post

如何成为一名程序员?

周三 5月 20 , 2020
成为一名程序员是一个日复一日、年复一年积累技能的累积过程,编程可以是有趣和有益的(精神上和经济上)。 […]