我正在学习C ++ 11,并对用户定义的文字感兴趣。 所以我决定玩一下。 有些语言的语法如下:
int n = 1000_000_000;
我试图在C ++ 11中模拟这个功能。
inline constexpr unsigned long long operator "" _000 (unsigned long long n)noexcept
{
return n * 1000;
}
inline constexpr unsigned long long operator "" _000_000 (unsigned long long n)noexcept
{
return n * 1000*1000;
}
inline constexpr unsigned long long operator "" _000_000_000 (unsigned long long n)noexcept
{
return n * 1000*1000*1000;
}
int main(){
constexpr auto i = 100_000; // instead of 100000
constexpr auto j = 23_000_000; // instead of 23000000;
}
但是对于一般情况我无法模拟它,即
auto general_case = 123_456_789; //无法编译
我的问题是“我可以使用C ++ 11模拟上述一般情况吗?”。
答案 0 :(得分:4)
目前,C ++ 11版本的语言中用户定义的文字是不可能的。用户定义的文字支持参数的有限格式,似乎不支持右侧参数,链接,还有表示以0开头的数字作为实际数字的问题。所以这是不行的。
您当前的方法将_000等定义为独立文字,因此编译器只能使用它们而不能使用其他文字。它不像_
是运算符,而000
是您可以使用的一些参数。
然而,您可以使用字母后缀。
long long constexpr operator"" K (long double n) {
return n * 1000;
}
long long constexpr operator"" M (long double n) {
return n * 1000000;
}
long long constexpr operator"" G (long double n) {
return n * 1000000000;
}
然后:
0.05M == 50000;
123.232K == 123232
1.000000001G == 1000000001
当然,最后一种情况有点挫败了目的,因为你再次拥有许多没有视觉指示的零...所以你可以去找类似的东西:
1.G + 1 == 1000000001 // much clearer 1 billion + 1
这使得它有点难看,因为文字需要一个实数,并且不能使用整数,除非你定义一个额外的文字只是用于整数。然后你可以简单地使用1G。
此外,这种方法可能会产生编译器警告,显然c ++组想要保留所有后缀,前面没有下划线用于“未来用途”。如果你想要警告消失,只需使用_K _M和_G。
编辑:我删除了初始化列表解决方案,因为它产生了无效的结果,数字如010,被处理为八进制并搞乱了计算。