我想用另一个
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
的工具。
std::array
代替? - Ben Voigt