我可以重载模板变量吗?
Can I overload template variables?
我想声明如下:
template <typename T>
constexpr enable_if_t<is_integral_v<T>, int[]> foo = { 1, 2 };
template <typename T>
constexpr enable_if_t<is_floating_point_v<T>, int[]> foo = { 10, 20, 30 };
但是当我尝试 I'm getting this error:
error: redeclaration of template<class T> constexpr std::enable_if_t<std::is_floating_point<_Tp>::value, int []> foo
note: previous declaration template<class T> constexpr std::enable_if_t<std::is_integral<_Tp>::value, int []> foo<T>
我觉得这应该是合法的,因为为任何给定的模板参数定义的 foo
永远不会超过一个。我可以做些什么来帮助编译器理解这一点吗?
不适用于重载。
你的 enable if 声明没问题,但你不能有多个,因为变量不可重载。
专业化,就像 类,它工作得很好:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T, typename = void>
constexpr int foo[] = {10, 20, 30};
template <typename T>
constexpr int foo<T, enable_if_t<is_integral_v<T>>>[] = { 1, 2 };
int main() {
cout << foo<int>[0] << endl;
cout << foo<float>[0] << endl;
}
因为不是超载,一个std::enable_if
就够了。 enable if被认为比没有特化更特化,一旦满足条件就会被采用,保留非整数类型模板参数的默认情况。
我想声明如下:
template <typename T>
constexpr enable_if_t<is_integral_v<T>, int[]> foo = { 1, 2 };
template <typename T>
constexpr enable_if_t<is_floating_point_v<T>, int[]> foo = { 10, 20, 30 };
但是当我尝试 I'm getting this error:
error: redeclaration of
template<class T> constexpr std::enable_if_t<std::is_floating_point<_Tp>::value, int []> foo
note: previous declarationtemplate<class T> constexpr std::enable_if_t<std::is_integral<_Tp>::value, int []> foo<T>
我觉得这应该是合法的,因为为任何给定的模板参数定义的 foo
永远不会超过一个。我可以做些什么来帮助编译器理解这一点吗?
不适用于重载。
你的 enable if 声明没问题,但你不能有多个,因为变量不可重载。
专业化,就像 类,它工作得很好:
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T, typename = void>
constexpr int foo[] = {10, 20, 30};
template <typename T>
constexpr int foo<T, enable_if_t<is_integral_v<T>>>[] = { 1, 2 };
int main() {
cout << foo<int>[0] << endl;
cout << foo<float>[0] << endl;
}
因为不是超载,一个std::enable_if
就够了。 enable if被认为比没有特化更特化,一旦满足条件就会被采用,保留非整数类型模板参数的默认情况。