将包含CONST char数组[N]成员的结构的聚合初始化转换为构造函数

时间:2018-02-18 13:59:35

标签: c++ c++14

给定一个包含 const char数组的简单结构,可以通过聚合初始化轻松初始化:

struct int_and_text {
  constexpr static int Size = 8;
  const int i;
  const char text[Size];
};
const int_and_text some_data[] = { { 0, "abc"}, { 77,  "length8" } };

但是现在我想添加一个构造函数,但到目前为止我没有尝试过任何工作,即使使用constexpr memcpy-ish变体也是如此。

template <std::size_t N>
int_and_text(int i_, const char (&text_)[N]) 
  : i{i_}, 
   text{"  ?  " /* const text[8] from const text[1-8] */ }
  { static_assert(N <= Size); }

这可能吗? const char text_[8]构造函数参数似乎会衰减为char*。从长远来看,一切constexpr也会很好。

1 个答案:

答案 0 :(得分:2)

#include <cstddef>
#include <utility>

class int_and_text
{
public:    
    template <std::size_t N>
    int_and_text(int i_, const char (&text_)[N]) 
        : int_and_text(i_, text_, std::make_index_sequence<N>{})
    {
    }

private:
    template <std::size_t N, std::size_t... Is>
    int_and_text(int i_, const char (&text_)[N], std::index_sequence<Is...>) 
        : i{i_}
        , text{text_[Is]...}
    {
        static_assert(N <= Size);
    }

    constexpr static int Size = 8;
    const int i;
    const char text[Size];
};

const int_and_text some_data[] = { {0, "abc"}, {77, "length8"} };

DEMO