将constexpr数组复制到类中

Dar*_*bik 4 c++ arrays constructor constexpr c++11

假设我有一个班级:

class MyClass{
  char array[12];
  public:
  MyClass(const char* arr) {
    for (int x = 0; x < 12; x++){
      array[x] = arr[x];
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

是否可以制作MyClass构造函数constexpr.棘手的部分是初始化新阵列....

max*_*x66 8

我想(我希望)以下示例可以提供帮助.

MyClass在一个模板化的类中转换了你的模板参数是数组的维度(12); 我希望不是问题.

应该适用于C++ 11和C++ 14

#include <iostream>

template <std::size_t ...>
struct range
 { };

template <std::size_t N, std::size_t ... Next>
struct rangeH 
 { using type = typename rangeH<N-1U, N-1U, Next ... >::type; };

template <std::size_t ... Next >
struct rangeH<0U, Next ... >
 { using type = range<Next ... >; };

template <std::size_t Dim>
class MyClass
 {
   public:
      char array[Dim];

      template <std::size_t ... rng>
         constexpr MyClass (const char arr[Dim], const range<rng...> &)
         : array{ arr[rng]... }
          { }

      constexpr MyClass (const char arr[Dim]) 
         : MyClass(arr, typename rangeH<Dim>::type())
          { }
 };


int main ()
 {
   constexpr MyClass<12> mc1("0123456789a");
   constexpr MyClass<37> mc2("0123456789abcdefghijklmnopqrstuvwxyz");

   std::cout << mc1.array << std::endl;
   std::cout << mc2.array << std::endl;

   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

ps:抱歉我的英语不好

---编辑:添加C++ 14示例 -

如果你(当你)可以使用C++ 14,你可以使用std::index_sequencestd::make_index_sequence避免rangerangeH.

这个例子变成了

#include <utility>
#include <iostream>

template <std::size_t Dim>
class MyClass
 {
   public:
      char array[Dim];

      template <std::size_t ... rng>
         constexpr MyClass (const char arr[Dim],
                            const std::index_sequence<rng...> &)
         : array{ arr[rng]... }
          { }

      constexpr MyClass (const char arr[Dim]) 
         : MyClass(arr, std::make_index_sequence<Dim>())
          { }
 };


int main ()
 {
   MyClass<12> mc1("0123456789a");
   MyClass<37> mc2("0123456789abcdefghijklmnopqrstuvwxyz");

   std::cout << mc1.array << std::endl;
   std::cout << mc2.array << std::endl;

   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

- 附录:如何避免明确的尺寸指示 -

如果你发现烦恼计算一个常量字符串中的字符,auto是你的朋友; 如果你constexpr以这种方式声明一个函数

template <std::size_t Dim>
constexpr MyClass<Dim> makeMyClass (const char (&arr)[Dim])
 { return MyClass<Dim> { arr }; }
Run Code Online (Sandbox Code Playgroud)

您可以MyClass<N>用这种方式声明类型的变量(或常量)

constexpr auto mc1 = makeMyClass("0123456789a");
constexpr auto mc2 = makeMyClass("0123456789abcdefghijklmnopqrstuvwxyz");
Run Code Online (Sandbox Code Playgroud)

代替

constexpr MyClass<12> mc1("0123456789a");
constexpr MyClass<37> mc2("0123456789abcdefghijklmnopqrstuvwxyz");
Run Code Online (Sandbox Code Playgroud)

也适用于C++ 14和C++ 11.