gpt4 book ai didi

C++11:用另一个 constexpr char 数组初始化 constexpr char 数组

转载 作者:行者123 更新时间:2023-11-30 02:16:49 28 4
gpt4 key购买 nike

我想用另一个 constexpr char[] 成员初始化 constexpr char[] 成员。是否可以在 C++11 或更高版本中执行?

#include <iostream>

struct Base {
static constexpr char ValueOne[] = "One";
static constexpr char ValueTwo[] = "Two";
};

template <typename T>
struct ValueOneHolder {
static constexpr char Value[] = T::ValueOne; // << How can one initialize this?
};

int main() {
std::cout << ValueOneHolder<Base>::Value << std::endl;
return 0;
}

最佳答案

I would like to initialize constexpr char[] member with another constexpr char [] member. Is it possible to do in C++11 or above?

从 C++14 开始,您可以使用 std::make_index_sequencestd::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_sequencestd::index_sequence 的替代品。

关于C++11:用另一个 constexpr char 数组初始化 constexpr char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54382238/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com