我如何推断 C++11 中的模板参数类型?
How can I deduce a template parameter type in C++11?
我正在尝试编写一个强制 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 解决方案,但欢迎使用其他标准的解决方案。
您正在寻找 auto
模板参数,在 C++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 之前这是不可能的,因为 。从概念上讲,在那之前无法做到这一点。
C++17 引入了 auto
作为非类型模板参数:
template <auto val>
constexpr auto force_constexpr() { return val; }
之前,你确实屏蔽过
template<typename T, T val>
constexpr T force_constexpr() { return val; }
可以引入MACRO来简化使用:
#define AUTO(v) decltype(v), (v)
然后
std::cout << force_constexpr<AUTO(triangle(0x200))>() << '\n';
我正在尝试编写一个强制 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 解决方案,但欢迎使用其他标准的解决方案。
您正在寻找 auto
模板参数,在 C++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 之前这是不可能的,因为
C++17 引入了 auto
作为非类型模板参数:
template <auto val>
constexpr auto force_constexpr() { return val; }
之前,你确实屏蔽过
template<typename T, T val>
constexpr T force_constexpr() { return val; }
可以引入MACRO来简化使用:
#define AUTO(v) decltype(v), (v)
然后
std::cout << force_constexpr<AUTO(triangle(0x200))>() << '\n';