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.
我尝试过其他东西(参见上一个问题),但仍然无法解决如何实现这一目标.
任何帮助非常感谢!谢谢.
正确地指定了@Mankarse,你不能fusion在for循环中使用容器,因为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容器的任何事情,所以选择就是你的!