Элемент C++ Constexpr типа шаблона

Я хочу создать класс шаблона с членом, который является массивом constexpr. Конечно, массив нуждается в другой инициализации в зависимости от типа, но я не могу объявить массив без его инициализации. Проблема в том, что я не знаю значения массива до специализации шаблона.

//A.hpp
template<typename T>
class A {
public:
    static constexpr T a[];
    constexpr A() {};
    ~A() {};
}
//B.hpp
class B: public A<int> {
public:
    constexpr B();
    ~B();
};
//B.cpp
template<>
constexpr int A<int>::a[]={1,2,3,4,5};
B::B() {}
B::~B() {}

Как правильно инициализировать A:: a[] в B?

1 ответов


каждую проблему можно решить, добавив еще один слой косвенности (за исключением слишком большого косвенности):

// no a[] here.
template <typename T> struct ConstArray;

template <> 
struct ConstArray<int> {
    static constexpr int a[] = {1, 2, 3, 4, 5};

    int operator[](int idx) const { return a[idx]; }
};

template <typename T>
class A {
    static constexpr ConstArray<T> a;
};