使用 Boost Hana 反射 C 风格的数组

Ste*_*art 5 c++ arrays reflection boost

BOOST_HANA_DEFINE_STRUCT用内省声明结构时是一个很棒的宏。如果我有这样的结构:

struct Person {
  std::string name;
  std::string last_name;
  int age;
};
Run Code Online (Sandbox Code Playgroud)

我们可以通过像这样重新定义它来添加自省:

struct Person {
  BOOST_HANA_DEFINE_STRUCT(Person,
    (std::string, name),
    (std::string, last_name),
    (int, age)
  );
};
Run Code Online (Sandbox Code Playgroud)

但是如果我们有这样的结构怎么办:

struct Person {
  float eye_dioptre[2];
};
Run Code Online (Sandbox Code Playgroud)

我将如何使用BOOST_HANA_DEFINE_STRUCT语法来反映 C 风格的数组?我试过了:

struct Person {
  BOOST_HANA_DEFINE_STRUCT(Person, 
    (float[2], eye_dioptre),   // error: expected unqualified-id before ‘[’ token
    (float, eye_dioptre[2])    // error: template argument 2 is invalid  BOOST_HANA_DEFINE_STRUCT(structure_name, __VA_ARGS__ );                    
  );
};
Run Code Online (Sandbox Code Playgroud)

上面的两个选项都会导致编译器错误。我期待的答案是“你应该使用 c++ 风格的数组”。可以这样做:

struct Person {
  BOOST_HANA_DEFINE_STRUCT(Person,
    (std::array<float,2>, eye_dioptre)
  );
Run Code Online (Sandbox Code Playgroud)

但是有没有办法用 C 风格的数组来做到这一点?};

Arn*_*rah 5

我能想到的唯一方法是仅使用我认为您不想要的指针,或者使用模板别名,这将类似于:

template<size_t N>
using floatArr = float[N];
Run Code Online (Sandbox Code Playgroud)

在定义时struct

struct Test {
    BOOST_HANA_DEFINE_STRUCT(Test,
        (floatArr<2>, example)
    );
};
Run Code Online (Sandbox Code Playgroud)

说明此工作的示例程序:[GCC]

事实上,您甚至可以将这个别名概括为任何类型:

template<typename T, size_t N>
using CArray = T[N];
Run Code Online (Sandbox Code Playgroud)

现在,任何类型的 C 样式数组都可以使用BOOST_HANA_DEFINE_STRUCT诸如CArray<float, 2> example.

  • `std::array` 是一个类,在这里,它只是一个别名。所以`eye_dioptre`实际上是`float[2]`。 (2认同)