gpt4 book ai didi

c++ - 如何 boost::fusion::for_each 添加类型以创建类型的 mpl::vector?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:56 27 4
gpt4 key购买 nike

我想遍历任何 fusion 结构的成员,将其成员的类型添加到 boost::mpl::vector(或集合)以创建这些类型的 boost::variant。任何帮助表示赞赏。

struct A
{
int a1;
double a2;
float a3;
};

BOOST_FUSION_ADAPT_STRUCT(
A,
(int,a1)
(double,a2)
(float,a3)
)

struct StructTypes
{
template <typename T>
void operator()( T& t ) const
{
// how do I append to a list of types here?
}
};

int main()
{
A a;
boost::fusion::for_each( a, StructTypes() );
}

最佳答案

我不是专家,但我认为您无法使用 fusion::for_each 完成您想要的事情.一个非常简单可行的替代方法是使用 fusion::joint_view 连接 mpl::vector与你的结构(你的结构适应的序列)。此 union View 不能直接用于 boost::make_variant_over , 但这可以通过使用 fusion::result_of::as_vector 轻松解决得到 fusion::vector具有相同的元素。这种方法的一个问题(我不确定这是否真的是一个问题,但它无疑是丑陋的)是如果你的 vector 和你的结构之间有共同的元素,那么生成的变体将在其列表中包含这些元素两次类型。如果你想解决这个问题,你可以使用 mpl::set而不是你的 vector ,然后使用 mpl::fold<A, mpl::set<your types...>, mpl::insert<_1,_2> >::type .这给你一个 mpl::set没有任何重复的类型。您需要使用 fusion::result_of::as_vector再次使用 make_variant_over .

Running on Coliru

#include <iostream>
#include <string>

#include <boost/variant.hpp>

#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/mpl.hpp> //important: allows compatibility fusion-mpl
#include <boost/fusion/include/joint_view.hpp>
#include <boost/fusion/include/as_vector.hpp>
#include <boost/fusion/include/set.hpp>
#include <boost/fusion/include/fold.hpp>
#include <boost/fusion/include/for_each.hpp>


#include <boost/mpl/fold.hpp>
#include <boost/mpl/set.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/insert.hpp>

namespace fusion=boost::fusion;
namespace mpl=boost::mpl;

struct A
{
int a1;
double a2;
float a3;
};

BOOST_FUSION_ADAPT_STRUCT(
A,
(int,a1)
(double,a2)
(float,a3)
)

struct printer
{
template <typename T>
void operator()(T) const
{
std::cout << typeid(T).name() << ";";
}
};


int main()
{
typedef fusion::result_of::as_vector<fusion::joint_view<mpl::vector<bool,std::string>,A> >::type types1;
typedef boost::make_variant_over<types1>::type variant1;

variant1 a = 3.5f;
variant1 b = true;

std::cout << a << " " << b << ". " << fusion::result_of::size<variant1::types>::type::value << " elements in the variant" << std::endl;
fusion::for_each(variant1::types(),printer());
std::cout << std::endl;

typedef mpl::fold<A,mpl::set<std::string,int>,mpl::insert<mpl::_1,mpl::_2>>::type types2;
typedef boost::make_variant_over<fusion::result_of::as_vector<types2>::type>::type variant2;

variant2 a2 = 4;
variant2 b2 = "bla";

std::cout << a2 << " " << b2 << ". " << fusion::result_of::size<variant2::types>::type::value << " elements in the variant" << std::endl;
fusion::for_each(variant2::types(),printer());
std::cout << std::endl;
}

关于c++ - 如何 boost::fusion::for_each 添加类型以创建类型的 mpl::vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19393520/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com