Я хотел бы инициализировать constexpr char[]
элемент с другим constexpr char []
членом. Можно ли это сделать в C++11
или выше?
Начиная с C ++ 14 вы можете использовать std::make_index_sequence
и std::index_sequence
.
Если все в порядке, если вы работаете со специализацией ValueOneHolder
, сначала вы можете разработать функцию constexpr
, которая при наличии массива в стиле C возвращает размер массива
template <typename T, std::size_t N>
constexpr std::size_t getDim (T const (&)[N])
{ return N; }
Гнездо, которое вы можете объявить ValueOneHolder
добавив второй параметр шаблона со значением по умолчанию, которое является последовательностью индекса, соответствующей T::ValueOne
template <typename T,
typename = std::make_index_sequence<getDim(T::ValueOne)>>
struct ValueOneHolder;
и последняя легкая часть: частичная специализация с инициализацией
template <typename T, std::size_t ... Is>
struct ValueOneHolder<T, std::index_sequence<Is...>>
{ static constexpr char Value[] = { T::ValueOne[Is] ... }; };
Не забудьте следующую строку вне структуры
template <typename T, std::size_t ... Is>
constexpr char ValueOneHolder<T, std::index_sequence<Is...>>::Value[];
Ниже приведен полный пример компиляции C ++ 14
#include <utility>
#include <iostream>
struct Base
{
static constexpr char ValueOne[] = "One";
static constexpr char ValueTwo[] = "Two";
};
template <typename T, std::size_t N>
constexpr std::size_t getDim (T const (&)[N])
{ return N; }
template <typename T,
typename = std::make_index_sequence<getDim(T::ValueOne)>>
struct ValueOneHolder;
template <typename T, std::size_t ... Is>
struct ValueOneHolder<T, std::index_sequence<Is...>>
{ static constexpr char Value[] = { T::ValueOne[Is] ... }; };
template <typename T, std::size_t ... Is>
constexpr char ValueOneHolder<T, std::index_sequence<Is...>>::Value[];
int main()
{
std::cout << ValueOneHolder<Base>::Value << std::endl;
}
Если вы хотите C ++ 11, вы можете разработать замену std::make_index_sequence
и std::index_sequence
.