2016-03-12 51 views
2

我有一個模板參數的函數,我知道它是幾個不同元素類型的標準C++容器的std::tuple。 如何從中抽取出一個類型爲std::tuple的元素類型?從C++中的容器元組中提取value_type的元組11

例如,假設我有以下功能

template <typename TupOfCtrs> 
void doStuff(const TupOfCtrs& tupOfCtrs) { 
    using TupOfElements = /*extract a tuple type by applying CtrT::value_type to each container in tupOfCtrs and combining the results into an std::tuple*/; 
    MyHelperClass<TupOfElements> helper; 
} 

,我知道它被稱爲是這樣的:

std::list<Foo> l {/*...*/}; 
std::vector<Bar> v {/*...*/}; 
std::deque<Baz> d {/*...*/}; 
auto tup = std::make_tuple(l, v, d); 

在這種情況下,我想被定義TupOfElements輔助型如std::tuple<Foo, Bar, Baz>。 請注意,我實際上並不需要創建這個元組,只能得到它的類型。

這怎麼可能實現,可能使用Boost::Fusion庫?

回答

4

你甚至可以以更簡單的方式,而不加速融合這樣做:

// Template which takes one type argument: 
template <typename Tuple> struct TupOfValueTypes; 

// Only provide a definition for this template for std::tuple arguments: 
// (i.e. the domain of this template metafunction is any std::tuple) 
template <typename ... Ts> 
struct TupOfValueTypes<std::tuple<Ts...> > { 
    // This definition is only valid, if all types in the tuple have a 
    // value_type type member, i.e. the metafunction returns a type only 
    // if all types of the members in the std::tuple have a value_type 
    // type member, and a std::tuple can be constructed from these: 
    using type = std::tuple<typename Ts::value_type...>; 
}; 

template <typename TupOfCtrs> 
void doStuff(const TupOfCtrs& tupOfCtrs) { 
    using TupOfElements = typename TupOfValueTypes<TupOfCtrs>::type; 
    // ... 
} 

但它當然更容易指定doStuffstd::tuple明確:

template <typename ... Ts> 
void doStuff(const std::tuple<Ts...> & tupOfCtrs) { 
    using TupOfElements = std::tuple<typename Ts::value_type...>; 
    // ... 
} 

PS :另外請注意,在許多情況下,如果您只需要一個類型列表,std::tuple類是一種矯枉過正的情況,並且可能會稍微傷害編譯時間。就個人而言,我一直用來代替簡單TypeList結構:

template <typename ... Ts> struct TypeList 
{ using type = TypeList<Ts...>; }; 
+0

太棒了,謝謝! :) –

4

如果你想doStuff採取std::tuple,做出明確的:

template <class... Ts> 
void doStuff(std::tuple<Ts...> const& tupOfCtr) { ... } 

一旦你的參數包,它只是一個拉出的問題value_type

template <class... Ts> 
void doStuff(std::tuple<Ts...> const& tupOfCtr) 
{ 
    using value_tuple = std::tuple<typename Ts::value_type...>; 
    // ... 
}