@Mankarseが正しく指定されているように、あなたはfusion
コンテナをfor
ループ内に使用することはできません。これは、fusion
コンテナがすべて約tuple
であり、各要素が異なるタイプである可能性があるからです他の要素では、fusion
コンテナを反復するすべての関数は実際には2つの関数であり、通常template
またはオーバーロードされた関数として実装されます。だからfusion
コンテナをvector
から初期化するには、そのベクトルにアクセスできる複数の関数(あるいは単純に複数のクラスや関数にコンパイルされるテンプレート)が必要です(少なくともvector
のイテレータと状態コールごとに増加する可能性のある変数)。だから、あなたは2つのオプションがあります:
1)を使用して後押し::融合を::倍:
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>());
}
2番目のケースは、はるかに複雑ですが、そのロジックを理解していれば、あなたがfusion
コンテナで何かをするために使用することができ、その選択は見ての通り全てあなたのもの!!
私のポストをML 'blah'は何ですか? 'blah'は反復ごとに異なる型を持たなければならないので(for recursive template functionを書く必要があるので)、まっすぐなfor-loopはうまく動作しません。挿入する値を表現する方法の例をいくつか教えてください。 – Mankarse
私は、挿入される値が適切な型に適切にキャストされると仮定しています。議論のために、あなたは 'blah'が' int'であると想像することができます。 – arlogb
これらは_runtime_で決定されず、_compile-time_で決定されます。 –