Как правильно указал @Mankarse, вы не можете использовать контейнеры fusion
в цикле for
, и это потому, что контейнеры fusion
связаны с tuple
, и каждый элемент может иметь тип, отличный от других элементов, все функции, которые проходят через контейнер fusion
, на самом деле являются парой функции и обычно реализуются как template
или перегруженные функции. Таким образом, чтобы инициализировать контейнер fusion
из 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
контейнерами, так что выбор только за вами!!
person
BigBoss
schedule
27.10.2012
blah
? Прямой цикл никогда не будет работать, потому чтоblah
должен иметь другой тип на каждой итерации (вам нужно написать рекурсивную функцию шаблона). Можете ли вы привести несколько примеров того, как вы представляете вставляемые значения? - person Mankarse   schedule 27.10.2012blah
этоint
. - person arlogb   schedule 27.10.2012