Могу ли я перегрузить переменные шаблона? - PullRequest
6 голосов
/ 14 июня 2019

Я хочу объявить что-то вроде этого:

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>

Я чувствую, что это должно быть законно, так как никогда не будет более одного foo, определенного для любого данного аргумента шаблона. Что я могу сделать, чтобы помочь компилятору понять это?

1 Ответ

8 голосов
/ 14 июня 2019

Не с перегрузкой.

Ваше объявление с разрешением 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.Если включение считается более специализированным, чем отсутствие специализации, оно будет выполнено, как только будет выполнено условие, оставляя значение по умолчанию для параметра шаблона нецелого типа.

Пример в реальном времени

...