首先,对与上一个问题here的相似性表示歉意,但我认为我没有提出正确的要求。

我有一个方法:

template <typename T>
void some_method( T &t)
{...}

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

我想用以下内容动态填充此 vector :
int blah = 5;
for(int i = 0; i<size(t); i++){
at_c<i>(t) = blah;
}

这不起作用,因为at_c需要const

我尝试了其他方法(请参阅上一个问题),但仍无法解决该问题。

任何帮助,不胜感激!
谢谢。

最佳答案

正如@Mankarse正确指定的那样,您不能在fusion循环中使用for容器,这是因为fusion容器都是关于tuple的,并且每个元素的类型可能与其他元素不同,所有通过fusion容器进行迭代的函数实际上都是几个函数,通常实现为template或重载函数。因此,为了从fusion初始化vector容器,您应该拥有多个都可以访问该 vector 的函数(或至少一个将被编译为多个类或函数的模板)(或至少是vector和状态的迭代器)每次通话可以增加的变量)。因此,您有2个选择:

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>() );
}

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>() );
}

如您所见,第二种情况要复杂得多,但是如果您了解其逻辑,则可以使用它对fusion容器执行任何操作,因此选择全由您自己决定!

关于c++ - 如何在运行时填充boost::fusion::vector?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13096239/

10-11 00:38