使用带有递归定义类型的C++ 11 initializer_list,使用constexpr

use*_*370 2 c++ recursive-datastructures initializer-list constexpr c++11

是否可以使用C++ 11 使用构造函数initializer_list组装递归定义的类Foo,如下所示constexpr:

template <size_t N>
struct Foo {
  constexpr Foo(int x, Foo<N-1> f) : x(x), xs(xs) {}
  int x;
  Foo<N-1> xs;
};

template <> struct Foo<0> {};
Run Code Online (Sandbox Code Playgroud)

我可以初始化一个Foo<3>使用:

int main(int argc, char *argv[])
{
  Foo<3> a = Foo<3>(1,Foo<2>(2,Foo<1>(3,Foo<0>())));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

最好使用Foo <3> a = {1,2,3}.如果有一个constexpr tail功能,initializer_list我认为它应该工作.

Xeo*_*Xeo 9

是的,以一种循环方式,有效地解压缩并将初始化列表重新打包为更合适的格式.但是,有一种更好的(imho)方式:Variadic模板.

#include <stddef.h>
#include <iostream>

template <size_t N>
struct Foo {
  template<class... Tail>
  constexpr Foo(int i, Tail... t) : x(i), xs(t...) {}

  void print(){
    std::cout << "(" << x << ", ";
    xs.print();
    std::cout << ")";
  }

  int x;
  Foo<N-1> xs;
};

template <> 
struct Foo<1> {
  constexpr Foo(int i) : x(i) {}
  void print(){ std::cout << "(" << x << ")"; }
  int x;
};

int main(){
 Foo<3> x = {1, 2, 3};
 x.print();
 std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)

按预期输出:

(1,(2,(3)))

请注意,我选择1作为基本情况,因为它更有意义.

  • 是的,这绝对是更好的方式.+1 (2认同)