由于@Mankarse正确指定,你不能使用fusion
容器在一个for
循环,那是因为fusion
容器就是关于tuple
并且每个元素可能具有与其他元素不同的类型,所有迭代的函数fusion
容器实际上是几个函数,通常实现为template
或重载函数。所以为了初始化一个fusion
容器从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>() );
}
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
容器,所以选择权都在你手中!