Deduce非类型模板参数

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添加?

Aar*_*aid 8

您目前的代码通常写成如下,我相信:

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可以.如果有必要,编译器会将其视为正常函数.


jal*_*alf 6

除非你有时间机器,否则无法完成.

函数的参数在运行时处理.是的,在你的情况下,它是一个字面常量,但这是一个特例.

在函数定义中,参数类型在编译时是固定的(因此,可用于推导模板参数),但参数仅在运行时固定.

你为什么需要这个?是不是你不必输入<>'s?

  • 将 `f(2, 3, "abc", true)` 转换为 `f_impl&lt;2, 3, true&gt;("abc")` 的宏怎么样? (2认同)