在cppreference上提到可以使用模板用户文字运算符,但有一些限制:
如果文字运算符是模板,则它必须具有空参数列表,并且只能有一个模板参数,该参数必须是元素类型为
char
的非类型模板参数包,例如
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?
}
问题:
10_x<'a'>;
或10_<'a'>x;
无法编译。答案 0 :(得分:7)
driver.swipe(startx, starty, endx, endy, duration
这不是很正确。模板参数列表不为空。当你写:
10_x; // empty template list, how to specify non-empty template parameters?
template <char... Cs>
??? operator "" _x()
来自文字左侧的内容。也就是说,当你写:
Cs
调用:
10_x
一个简单的例子是构建一个编译时,溢出安全的二进制文字,以便:
operator ""_x<'1', '0'>();
答案 1 :(得分:4)
您的模板参数已经指定 - 他们包含您的文字值的源代码字符!因此对于10_x
,您实际上是在呼叫:
template<> double operator "" _x<'1', '0'>();
这是一个有效的例子。它编译时没有错误,并且没有触发任何断言。
#include <cassert>
enum class MyEnum
{
ONE,
TWO,
THREE
};
template<char...> MyEnum operator "" _e();
template<> MyEnum operator "" _e<'1'>()
{
return MyEnum::ONE;
}
template<> MyEnum operator "" _e<'2'>()
{
return MyEnum::TWO;
}
template<> MyEnum operator "" _e<'3'>()
{
return MyEnum::THREE;
}
int main()
{
assert(1_e == MyEnum::ONE);
assert(2_e == MyEnum::TWO);
assert(3_e == MyEnum::THREE);
}
答案 2 :(得分:2)
您可以以某种方式详细说明参数包(如其他人所述),或者如果您愿意,可以将它们作为编译时字符串访问:
template<int N>
constexpr double f(const char(&str)[N]) { return .42; }
template <char... C>
constexpr double operator "" _x()
{
return f({C...});
}
您是否有任何关于此类模板化运算符的实际使用示例?
您可以使用上述技术来处理编译时 string-to-num 转换器,并使用10_x
而不是f("10")
或类似的东西。