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

标签 c++ c++11 templates constexpr

我正在尝试编写一个强制 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 解决方案,但欢迎其他标准的解决方案。

最佳答案

您正在寻找 C++17 中的 auto 模板参数:

#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 之前是可能的,因为 this is precisely the use case for which auto template parameters were added to the standard 。在此之前,从概念上讲,无法做到这一点。

关于c++ - 如何推断 C++11 中的模板参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60663589/

相关文章:

c++ - 打印模板函数中的任何结构

c++ - 在自定义类中实例化自定义类时出现 "expected type-specifier"错误

c++ - 运行时已知大小的二维数组列表(或 vector )的声明

c++ - 变量模板编译时数组

c++ - 该标准是否定义了共同基础?

c++ - 两个类的 "Addition"

c++ - 使用 regex_search 获取所有匹配项的索引?

linux - c++11 线程池在 windows 上工作-在 linux 上是 block

c++ - 将类型名称传递给模板化运算符

c++ - 如何转发声明在未命名命名空间中的类