gpt4 book ai didi

c++ - 何时以及如何使用模板文字运算符?

转载 作者:可可西里 更新时间:2023-11-01 16:30:04 24 4
gpt4 key购买 nike

关于 cppreference有人提到可以模板化用户文字运算符,但有一些限制:

If the literal operator is a template, it must have an empty parameter list and can have only one template parameter, which must be a non-type template parameter pack with element type char, such as

template <char...> double operator "" _x();

所以我在下面的代码中写了一个:

template <char...> 
double operator "" _x()
{
return .42;
}

int main()
{
10_x; // empty template list, how to specify non-empty template parameters?
}

问题:

  1. 代码有效,但我如何使用带有一些非空模板参数的运算符? 10_x<'a'>;10_<'a'>x;不编译。
  2. 您有任何此类模板化运算符在现实世界中的使用示例吗?

最佳答案

10_x; // empty template list, how to specify non-empty template parameters?

这不太对。模板参数列表不为空。当你写:

template <char... Cs> 
??? operator "" _x()

Cs 由文字左侧的内容填充。也就是说,当你写:

10_x

调用:

operator ""_x<'1', '0'>();

一个简单的例子是构建一个编译时、溢出安全的二进制文字,这样:

template <uint64_t V>
constexpr uint64_t make_binary() {
return V;
}

template <uint64_t V, char C, char... Cs>
constexpr uint64_t make_binary() {
static_assert(C == '0' || C == '1', "invalid binary");

return make_binary<2*V + C - '0', Cs...>();
}

template <char... Cs>
uint64_t operator "" _b()
{
static_assert(sizeof...(Cs) <= 64, "overflow");

return make_binary<0, Cs...>();
}

uint64_t a = 101_b; // OK: a == 5
uint64_t b = 102_b; // error: invalid
uint64_t c = 11111111110000000000111111111100000000001111111111000000000011111111110000000000_b; // error: overflow

关于c++ - 何时以及如何使用模板文字运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39795893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com