如何推断C ++ 11中的模板参数类型?

SS安妮

我正在尝试编写一个强制constexpr通过评估的函数模板。我写了这个,但是它仅适用于int(请注意,使用GCC会产生递归深度错误):

#include <iostream>

template<int val>
constexpr int force_constexpr() { return val; }

constexpr int triangle(int n)
{
    return n ? n + triangle(n - 1) : 0;
}

int main(void)
{
    std::cout << force_constexpr<triangle(0x200)>() << '\n';
}

请注意,这仅用于演示目的;我知道可以使用来计算三角形数(n+1)*n/2

然后,我尝试编写一个泛型函数,但是效果不佳。这是一个普通的错误(不足为奇,因为它在使用T之前T已定义):

template<T val, typename T = decltype(val)>
constexpr T force_constexpr() { return val; }

就像这样(这显然不起作用;这是一个嵌套模板):

template<typename T>
template<T val>
constexpr T force_constexpr() { return val; }

这需要传递参数的类型:

template<typename T, T val>
constexpr T force_constexpr() { return val; }

如何在不将类型作为参数传递给模板的情况下执行此操作?或者换句话说,如何推断模板参数类型?

我正在寻找C ++ 11解决方案,但欢迎使用其他标准的解决方案。

山姆·瓦尔沙夫奇克

您正在autoC ++ 17中寻找模板参数:

#include <iostream>

template<auto T>
auto *singleton()
{
    static const decltype(T) solo{T};

    return &solo;
}

int main()
{
    const int *p=singleton<42>();

    std::cout << "The meaning of life: " << *p << std::endl;

    return 0;
}

将模板参数指定为auto,并用于decltype推断其类型。

我不认为这在C ++ 17之前是不可能的,因为这恰好是auto在标准中添加模板参数的用例从概念上讲,在此之前无法做到。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章