pez*_*ode 7 c++ templates c++11 template-argument-deduction
是否可以从模板函数参数中推导出非类型模板参数?
考虑这个简单的模板:
template <int N> constexpr int factorial()
{
return N * factorial<N - 1>();
}
template <> constexpr int factorial<0>()
{
return 1;
}
template <> constexpr int factorial<1>()
{
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够改变,factorial以便我可以这样称呼它:
factorial(5);
Run Code Online (Sandbox Code Playgroud)
让编译器在编译时计算出N的值.这可能吗?也许有一些花哨的C++ 11添加?
您目前的代码通常写成如下,我相信:
constexpr factorial (int n)
{
return n > 0 ? n * factorial( n - 1 ) : 1;
}
Run Code Online (Sandbox Code Playgroud)
如果你用一个常量表达式来调用它,比如factorial(5),那么所有的编译器魔法都会起作用.但是,如果你这样做int a = 3; factorial(a),那么我认为它将依赖于传统的功能 - 即它不会构建一个预先计算出的答案的查找表.
通常,您应该将每个函数和构造函数标记为constexpr可以.如果有必要,编译器会将其视为正常函数.
除非你有时间机器,否则无法完成.
函数的参数在运行时处理.是的,在你的情况下,它是一个字面常量,但这是一个特例.
在函数定义中,参数类型在编译时是固定的(因此,可用于推导模板参数),但参数值仅在运行时固定.
你为什么需要这个?是不是你不必输入<>'s?