繁体   English   中英

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

[英]Reflecting C-style arrays with Boost Hana

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

struct Person {
  std::string name;
  std::string last_name;
  int age;
};

我们可以通过重新定义它来添加内省:

struct Person {
  BOOST_HANA_DEFINE_STRUCT(Person,
    (std::string, name),
    (std::string, last_name),
    (int, age)
  );
};

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

struct Person {
  float eye_dioptre[2];
};

我如何使用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__ );                    
  );
};

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

struct Person {
  BOOST_HANA_DEFINE_STRUCT(Person,
    (std::array<float,2>, eye_dioptre)
  );

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

我能想到的唯一方法是使用一个我认为你不想要的指针,或者使用模板别名 ,这可能是这样的:

template<size_t N>
using floatArr = float[N];

在定义struct

struct Test {
    BOOST_HANA_DEFINE_STRUCT(Test,
        (floatArr<2>, example)
    );
};

一个示例程序说明了这个工作: [GCC]

实际上,你甚至可以为任何类型推广这个别名:

template<typename T, size_t N>
using CArray = T[N];

现在,可以使用诸如CArray<float, 2> example类的语法将任何类型的C样式数组与BOOST_HANA_DEFINE_STRUCT使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM