如何检查升压融合序列是否为自适应结构?

How to check if a boost fusion sequence is an adapted struct?

提问人:Vlad.Z 提问时间:11/17/2019 更新时间:11/17/2019 访问量:270

问:

是否有特征或元函数或任何内容可以在编译时检查序列是否实际上是一个适应的结构,以便我可以例如获取其成员名称?我看到人们通过排除来做到这一点,类似于“如果它不是一个向量,但它仍然是一个序列,那么它一定是一个结构”(我正在编造,因为我记不清了)。我不认为这是一个充分的条件,可能应该有更好的融合来实现这一目标。虽然找不到。如果您知道,请分享。谢谢。

C++ 结构 元编程 boost-fusion

评论


答:

0赞 2 revsllonesmiz #1

我不知道是否有更好的方法,但您可以使用:

template <typename T>
using is_adapted_struct=std::is_same<typename boost::fusion::traits::tag_of<T>::type,boost::fusion::struct_tag>;

这将适用于改编或定义的结构,我相信它们也具有命名和模板化的变体(但不适用于 和它的变体(您需要替换 with 才能使其工作))。我认为(这对您的用例来说可能是一个问题)对于适应 .BOOST_FUSION_ADAPT_STRUCTBOOST_FUSION_DEFINE_STRUCTBOOST_FUSION_ADAPT_ASSOC_STRUCTstruct_tagassoc_struct_tagBOOST_FUSION_ADAPT_ADT

魔杖盒上的示例

#include <iostream>
#include <type_traits>
#include <boost/fusion/include/tag_of.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/vector.hpp>

struct adapted
{
    int foo;
    double bar;
};

BOOST_FUSION_ADAPT_STRUCT(adapted, foo, bar);

struct not_adapted{};


template <typename T>
using is_adapted_struct=std::is_same<typename boost::fusion::traits::tag_of<T>::type,boost::fusion::struct_tag>;



int main()
{
    static_assert(is_adapted_struct<adapted>::value);
    static_assert(!is_adapted_struct<not_adapted>::value);
    static_assert(!is_adapted_struct<boost::fusion::vector<int,double>>::value);
}