如何检查增强融合序列是否是适应的结构?
How to check if a boost fusion sequence is an adapted struct?
是否有特征或元函数或任何在编译时检查序列是否实际上是改编结构的东西,以便我可以,例如获取其成员名称?我看到人们通过排除来做到这一点,类似于“如果它不是一个向量但它仍然是一个序列,那么它一定是一个结构”(我在编造,因为我记不太清楚了)。我不认为这是一个充分条件,可能应该有更好的融合来实现这一点。却找不到。如果你知道请分享。谢谢。
不知道有没有更好的办法,你可以用:
template <typename T>
using is_adapted_struct=std::is_same<typename boost::fusion::traits::tag_of<T>::type,boost::fusion::struct_tag>;
这将适用于使用 BOOST_FUSION_ADAPT_STRUCT
改编或使用 BOOST_FUSION_DEFINE_STRUCT
定义的结构,我相信它们的命名和模板化变体(但不适用于 BOOST_FUSION_ADAPT_ASSOC_STRUCT
及其变体(您会需要将 struct_tag
替换为 assoc_struct_tag
才能正常工作))。我认为(这对您的用例来说可能是个问题)对于 类 适应 BOOST_FUSION_ADAPT_ADT
的 return 也是如此。
#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);
}
是否有特征或元函数或任何在编译时检查序列是否实际上是改编结构的东西,以便我可以,例如获取其成员名称?我看到人们通过排除来做到这一点,类似于“如果它不是一个向量但它仍然是一个序列,那么它一定是一个结构”(我在编造,因为我记不太清楚了)。我不认为这是一个充分条件,可能应该有更好的融合来实现这一点。却找不到。如果你知道请分享。谢谢。
不知道有没有更好的办法,你可以用:
template <typename T>
using is_adapted_struct=std::is_same<typename boost::fusion::traits::tag_of<T>::type,boost::fusion::struct_tag>;
这将适用于使用 BOOST_FUSION_ADAPT_STRUCT
改编或使用 BOOST_FUSION_DEFINE_STRUCT
定义的结构,我相信它们的命名和模板化变体(但不适用于 BOOST_FUSION_ADAPT_ASSOC_STRUCT
及其变体(您会需要将 struct_tag
替换为 assoc_struct_tag
才能正常工作))。我认为(这对您的用例来说可能是个问题)对于 类 适应 BOOST_FUSION_ADAPT_ADT
的 return 也是如此。
#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);
}