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

时间:2016-09-30 16:17:53

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

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?
}

问题:

  1. 代码有效,但如何将运算符与一些非空模板参数一起使用? 10_x<'a'>;10_<'a'>x;无法编译。
  2. 您是否有任何关于此类模板化运算符的实际使用示例?

3 个答案:

答案 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")或类似的东西。

相关问题