如何在运行时填充boost :: fusion :: vector?

arl*_*ogb 6 c++ boost boost-fusion

首先,在这里向我前一个问题的相似性道歉,但我认为我没有问正确的事情.

我有一个方法:

template <typename T>
void some_method( T &t)
{...}
Run Code Online (Sandbox Code Playgroud)

需要fusion::vector<T1, T2, T3, ..., Tn>在运行时确定类型- 例如vector<int, double>在一个调用中和vector<int, double, int>另一个调用中.

我想用以下内容动态填充此向量:

int blah = 5;
for(int i = 0; i<size(t); i++){
at_c<i>(t) = blah;
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为at_c期望a const.

我尝试过其他东西(参见上一个问题),但仍然无法解决如何实现这一目标.

任何帮助非常感谢!谢谢.

Big*_*oss 6

正确地指定了@Mankarse,你不能fusionfor循环中使用容器,因为fusion容器都是关于的tuple,每个元素可能与其他元素有不同的类型,迭代fusion容器的所有函数实际上是几个函数,通常实现为template或过载的功能.因此,为了fusion从a 初始化容器,vector你应该有多个函数(或者只是一个将被编译成多个类或函数的模板),它们都可以访问该向量(或者至少是一个迭代器来自vector和一个状态变量,可以每次通话都增加了).所以你有两个选择:

1)使用boost :: fusion :: fold:

template< class StdIteratorT >
struct initialize_fusion_container_from_std_iterator {
    typedef StdIteratorT    result_type;

    template< class T >
    StdIteratorT operator()( StdIteratorT i, T& val ) {
        val = *i;
        return ++i;
    }
};
void use_fold_demo() {
    int p1[] = {4, 5, 6};
    fusion::vector<int, double, int> fv;
    std::vector<int> sv2( p1, p1 + _countof(p1) );
    fusion::fold( fv, sv2.begin(),
    initialize_fusion_container_from_std_iterator<std::vector<int>::iterator>() );
}
Run Code Online (Sandbox Code Playgroud)

2)编写一个递归调用容器的下一个项目的函数(记住这个函数的语法就像递归函数,但它根本不是递归的):

// this will be called when we reach end of the fusion container(FIBeginT==FIEndT)
template< class FIBeginT, class FIEndT, class StdIteratorT >
void set_fusion_iterator( FIBeginT b, FIEndT e, StdIteratorT i, boost::mpl::true_ )
{
}
// this will be called when FIBeginT != FIEndT
template< class FIBeginT, class FIEndT, class StdIteratorT >
void set_fusion_iterator( FIBeginT b, FIEndT e, StdIteratorT i, boost::mpl::false_ )
{
    *b = *i;
    set_fusion_iterator( fusion::next(b), e, ++i,
        fusion::result_of::equal_to<
            typename fusion::result_of::next<FIBeginT>::type, FIEndT >() );
}

void recursive_function_demo() {
    typedef fusion::vector<int, double, int>    my_fusion_vector;

    int p1[] = {1, 2, 3};
    std::vector<int> sv1( p1, p1 + _countof(p1) );
    fusion::vector<int, double, int> fv;
    set_fusion_iterator( fusion::begin(fv), fusion::end(fv), sv1.begin(),
        fusion::result_of::equal_to<
            typename fusion::result_of::end<my_fusion_vector>::type,
            typename fusion::result_of::begin<my_fusion_vector>::type>() );
}
Run Code Online (Sandbox Code Playgroud)

如你所见,第二种情况要复杂得多,但如果你理解它的逻辑,就可以用它来做fusion容器的任何事情,所以选择就是你的!