我可以重载模板变量吗?

时间:2019-06-14 12:44:42

标签: c++ templates overloading enable-if template-variables

我想声明如下内容:

if (result == "1") { }

但是当我尝试I'm getting this error时:

  

错误:重新声明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 };
  注意:先前的声明template<class T> constexpr std::enable_if_t<std::is_floating_point<_Tp>::value, int []> foo

我觉得这应该是合法的,因为为任何给定的模板参数定义的template<class T> constexpr std::enable_if_t<std::is_integral<_Tp>::value, int []> foo<T>都不会超过一个。有什么我可以帮助编译器理解的吗?

1 个答案:

答案 0 :(得分:8)

不能超载。

您的带有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就足够了。启用if被认为比没有特殊更专门,它将在满足条件后立即采用,而对于非整数类型模板参数则保留默认情况。

Live example