使用 Boost Fusion 获取结构名称

getting the structure name with boost fusion

提问人:Abruzzo Forte e Gentile 提问时间:5/10/2020 更新时间:5/11/2020 访问量:351

问:

使用 可以迭代适应的结构并获取该结构的每个成员的名称。boost::fusion

有没有办法以某种方式检索结构的名称?

我想做的是:鉴于当前的情况

namespace inner { 
struct test_struct {
  int a;
  int b;
} }

BOOST_FUSION_ADAPT_STRUCT( inner::test_struct, a, b );      

我想要一个将返回“test_struct”(或“inner::test_struct”)的函数

我确实检查了包含和其他扩展类的头文件 [*],但我没有找到任何具有此目的的扩展类。struct_size

你知道有没有什么可以做的吗?

[*] boost/fusion/adapted/struct/detail/extension.hpp

C++ 模板 提升 提升融合

评论


答:

1赞 sehe 5/11/2020 #1

这不是一个功能。您可以通过检查预处理器的输出来查看它。

您可以看到扩展名,但结构名称没有这样的文字:struct_member_name

namespace boost {
    namespace fusion {
        namespace traits {
            template <> struct tag_of<inner::test_struct> { typedef struct_tag type; };
            template <> struct tag_of<inner::test_struct const> {
                typedef struct_tag type;
            };
        } // namespace traits
        namespace extension {
            template <> struct access::struct_member<inner::test_struct, 0> {
                struct deduced_attr_type {
                    static const inner::test_struct& obj;
                    typedef boost::type_of::remove_cv_ref_t<decltype(obj.a)> type;
                };
                typedef deduced_attr_type::type attribute_type;
                typedef attribute_type type;
                template <typename Seq> struct apply {
                    typedef typename add_reference<
                        typename mpl::eval_if<is_const<Seq>, add_const<attribute_type>,
                                 mpl::identity<attribute_type>>::type>::type
                                     type;
                    constexpr static type call(Seq& seq) { return seq.a; }
                };
            };
            template <> struct struct_member_name<inner::test_struct, 0> {
                typedef char const* type;
                constexpr static type call() { return "a"; }
            };
            template <> struct access::struct_member<inner::test_struct, 1> {
                struct deduced_attr_type {
                    static const inner::test_struct& obj;
                    typedef boost::type_of::remove_cv_ref_t<decltype(obj.b)> type;
                };
                typedef deduced_attr_type::type attribute_type;
                typedef attribute_type type;
                template <typename Seq> struct apply {
                    typedef typename add_reference<
                        typename mpl::eval_if<is_const<Seq>, add_const<attribute_type>,
                                 mpl::identity<attribute_type>>::type>::type
                                     type;
                    constexpr static type call(Seq& seq) { return seq.b; }
                };
            };
            template <> struct struct_member_name<inner::test_struct, 1> {
                typedef char const* type;
                constexpr static type call() { return "b"; }
            };
            template <> struct struct_size<inner::test_struct> : mpl::int_<2> {};
            template <> struct struct_is_view<inner::test_struct> : mpl::false_ {};
        } // namespace extension
    } // namespace fusion
    namespace mpl {
        template <typename> struct sequence_tag;
        template <> struct sequence_tag<inner::test_struct> {
            typedef fusion::fusion_sequence_tag type;
        };
        template <> struct sequence_tag<inner::test_struct const> {
            typedef fusion::fusion_sequence_tag type;
        };
    } // namespace mpl
} // namespace boost

与往常一样,添加自己的宏以获取额外信息可能并不难。例如,参见使用 Boost Spirit X3 解析具有交替标记的 Selector 结构结构,或 Boost 融合序列类型和结构类的名称标识

评论

0赞 Abruzzo Forte e Gentile 5/11/2020
嗨,Sehe。感谢您将我指向代码的内部。我会按照你的建议包装它。