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