正如@Mankarse所指出的那样,您不能在for循环中使用fusion容器,因为fusion容器涉及元组,每个元素可能与其他元素具有不同的类型。遍历fusion容器的所有函数实际上都是成对的函数,并且通常是作为模板或重载函数实现的。因此,为了从向量初始化fusion容器,您应该拥有多个函数(或简单地编译为多个类或函数的模板),它们都可以访问该向量(或至少是来自向量的迭代器和可以增加每次调用的状态变量)。所以您有两个选择:
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) 编写一个函数,该函数以容器的下一项递归调用自身(请记住,此函数的语法类似于递归函数,但实际上并不是递归的):
template< class FIBeginT, class FIEndT, class StdIteratorT >
void set_fusion_iterator( FIBeginT b, FIEndT e, StdIteratorT i, boost::mpl::true_ )
{
}
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
容器相关的事情,所以选择权在于您!
blah
?直接使用for循环永远不会起作用,因为在每次迭代中,blah
必须具有不同的类型(您需要编写递归模板函数)。您能提供一些表示要插入的值的方式的示例吗? - Mankarseblah
是一个int
。 - arlogb