2011-03-30 77 views
3

我想使用Boost的any_range來處理多個異構數據範圍。類型我的數據範圍被稱爲一個融合載體,例如:Boost Fusion/MPL:將類型從序列轉換爲等效的序列any_range's

typedef vector<double, int, char> TypeSequence 

鑑於這樣的類型,我想寫一個模板來獲得進一步的類型是這樣的:

vector<AnyRange<double>::value, AnyRange<int>::value, AnyRange<char>::value> 

哪裏AnyRange定義爲:

using namespace boost; 
template <typename T> 
struct AnyRange 
{ 
    typedef typename any_range<typename T, forward_pass_traversal_tag, int, std::ptrdiff_t> value; 
}; 

我試過了,失敗了。這甚至可能與Fusion? MPL?或者也許我正在用any_range走錯路。

+0

這絕對應該是可能的 - 但是,它看起來更像你想從MPL向量(一個沒有實際數據)轉換成融合表達載體(一個帶數據)。此外,您對「typename」的使用看起來有點不合適...... – ltjax 2011-03-30 08:55:06

回答

7

(如你有適當的標題,使融合序列表現爲確認MPL序列只要)你可以做到這一點很容易地使用boost::mpl::transform,您可以與融合順序使用:

#include <boost/range/any_range.hpp> 

#include <boost/fusion/include/mpl.hpp> // Required to adapt Fusion to MPL 
#include <boost/fusion/include/vector.hpp> 

#include <boost/mpl/transform.hpp> 


template < typename T > 
struct EmbedInAnyRange 
{ 
    typedef boost::any_range< // no need for typename here 
     T,     // no need for typename here 
     forward_pass_traversal_tag, 
     int,     // not sure what this parameter is, I leave int... 
     std::ptrdiff_t 
    > type; 
}; 

int main() 
{ 
    typedef boost::fusion::vector< double, int, char > Tuple; 

    typedef boost::mpl::transform< 
     Tuple, 
     EmbedInAnyRange<boost::mpl::_> 
    >::type AnyRangeTuple; 

    AnyRangeTuple myTuple( 
     std::vector<double>(), 
     std::list<int>(), 
     std::vector<char>()); 
} 

如果你想,你可以把改造成自己的元函數:

template < typename Seq > 
struct EmbedAllInAnyRange 
{ 
    typedef typename boost::mpl::transform< // typename needed 
     Seq, 
     EmbedInAnyRange<boost::mpl::_> 
    >::type type; 
}; 

... 

typedef EmbedAllInRange<Tuple>::type AnyRangeTuple; 
+1

值得注意的是'#include '(或...'/ include/mpl.hpp')在這裏是必需的。與文檔相反,boost融合序列不是自動的MPL序列,至少不包括這個頭文件。如果未包含此標頭,可能會導致一些非常晦澀的(即使是MPL)錯誤消息。 – Alastair 2013-02-07 19:56:16

+0

@Luc Touraille:我只能確認@Alastair在這裏寫了什麼,因此建議編寫一個關於包含''的大字條。剛剛遇到了一個非常奇怪的錯誤消息:'錯誤:隱式實例化未定義模板'boost :: mpl :: clear_impl :: apply ovanes 2017-06-11 11:42:58