2

我想獲得給定參數包的std::make_tuple返回的類型。到現在爲止我寫了下面的代碼:result_of,make_tuple,參數包

#include <tuple> 
#include <functional> 

template <class T> 
struct unwrap_refwrapper 
{ 
    using type = T; 
}; 

template <class T> 
struct unwrap_refwrapper<std::reference_wrapper<T>> 
{ 
    using type = T&; 
}; 

template <class T> 
using special_decay_t = typename unwrap_refwrapper<typename std::decay<T>::type>::type; 

template<class ... Types> 
struct foo 
{ 
    typedef std::tuple<special_decay_t<Types>...> tuple_t; 
}; 

int main() 
{ 
    short s; 
    // t should be std::tuple<int, double&, short&> 
    typedef foo<int, double&, decltype(std::ref(s))>::tuple_t t; 
} 

但我覺得它很醜陋複製possible implementation of std::make_tuple,我在這裏做的一部分。

我想用std::result_of或其他類似的東西來達到給定的效果。

我嘗試如下所示:

#include <tuple> 
#include <functional> 

template<class ... Types> 
struct foo 
{ 
    typedef typename std::result_of< 
     std::make_tuple(Types...)>::type tuple_t; 
}; 

int main() 
{ 
    short s; 
    // t should be std::tuple<int, double&, short&> 
    typedef foo<int, double&, decltype(std::ref(s))>::tuple_t t; 
} 

但它確實not compile

怎麼辦?

+0

你應該給'result_of'一個可調用的對象,但實際上它是調用該函數的結果。你可以使用'decltype'代替它。 – BoBTFish

+0

爲什麼你需要複雜的邏輯來反向設計'make_tuple'的返回類型?這是指定的,並不是超級複雜的。 –

+0

@KerrekSB:我儘量避免對'make_tuple'的返回類型進行反向工程,到目前爲止還沒有成功。但[T.C.S答案](http://stackoverflow.com/questions/42001013/result-of-make-tuple-parameter-pack/42001110#42001110)正是我所期待的。 –

回答

4
template<class... Ts> 
struct foo 
{ 
    using tuple_t = decltype(std::make_tuple(std::declval<Ts>()...)); 
};