C ++ 11用户定义的文字

时间:2013-08-20 06:10:05

标签: c++ c++11 user-defined-literals

我正在学习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模拟上述一般情况吗?”。

1 个答案:

答案 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,被处理为八进制并搞乱了计算。