【发布时间】:2012-01-12 14:57:36
【问题描述】:
是否可以从模板函数参数中推导出非类型模板参数?
考虑这个简单的模板:
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;
}
我希望能够更改 factorial 以便我可以这样称呼它:
factorial(5);
并让编译器在编译时计算出 N 的值。 这可能吗?也许添加了一些花哨的 C++11?
【问题讨论】:
-
您为什么要这样做?
factorial函数不接受任何参数。factorial(5)比正确的factorial<5>()有什么好处? -
@CodyGray:我认为这个想法是创建一个通用的
factorial函数,如果它给出了一个编译时已知的表达式,则能够在编译时计算结果,但也能够计算如果输入是普通变量,则在运行时。 -
@Matteo:据我所知,由于表达式被声明为
constexpr,因此在运行时没有计算任何内容。无论如何,我不明白为什么使用标准语法传递“普通变量”而不是 5 会有任何问题。这里的问题是“我怎样才能避免输入尖括号”,我不明白动机。 -
我想避免更改大量代码。另外,我发现它更惯用,但这是我可以轻松传递的东西;)
-
@CodyGray:
constexpr就像@Matteo 所说的那样工作:如果constexpr函数调用中的所有参数都是编译时常量,则调用将在编译时进行评估,否则,它会被执行在运行时像任何其他函数一样。
标签: c++ c++11 templates template-argument-deduction