【发布时间】:2011-12-27 20:27:00
【问题描述】:
我正在测试用户定义的文字。我想让_fac 返回数字的阶乘。
让它调用 constexpr 函数可以工作,但是它不允许我使用模板来执行此操作,因为编译器抱怨参数不是也不能是 constexpr。
我对此感到困惑 - 文字不是常量表达式吗? 5_fac 中的 5 始终是可以在编译时评估的文字,那为什么我不能这样使用它呢?
第一种方法:
constexpr int factorial_function(int x) {
return (x > 0) ? x * factorial_function(x - 1) : 1;
}
constexpr int operator "" _fac(unsigned long long x) {
return factorial_function(x); // this works
}
第二种方法:
template <int N> struct factorial_template {
static const unsigned int value = N * factorial_template<N - 1>::value;
};
template <> struct factorial_template<0> {
static const unsigned int value = 1;
};
constexpr int operator "" _fac(unsigned long long x) {
return factorial_template<x>::value; // doesn't work - x is not a constexpr
}
【问题讨论】:
-
我认为还没有任何编译器实现这些用户定义的文字。你如何测试这个?
-
不错!我不知道这还支持。我在某处的机器上安装了其中一个,现在我很想制定那些可变参数模板:-)
标签: c++ c++11 constexpr user-defined-literals