由於@Mankarse指定正確,你不能在for
循環中使用fusion
容器,這是因爲fusion
容器都是關於tuple
,並且每個元素可能具有不同的類型其他元素,遍歷容器的所有函數實際上是一對函數,通常實現爲template
或重載函數。所以爲了從vector
初始化一個fusion
容器,你應該有多個函數(或者簡單地說是一個將被編譯成多個類或函數的模板),它們都可以訪問該向量(或者至少有一個來自vector
的迭代器和一個狀態每次呼叫都可以增加的變量)。所以,你有2種選擇:
1)使用boost ::融合::折:
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
容器做任何事,所以選擇全都是你的!!
是什麼'blah'?直接for循環將永遠不會工作,因爲'blah'在每次迭代中必須有不同的類型(您需要編寫遞歸模板函數)。你能提供一些你代表要插入的值的例子嗎? – Mankarse
我假設將被插入的值將被適當地轉換爲正確的類型。爲了爭論,你可以想象'blah'是一個'int'。 – arlogb
它們將不會在_runtime_確定,它們將在_compile-time_處確定。 –