首先,对与上一个问题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/