2

与えられたパラメータパックに対してstd::make_tupleが返す型を取得したいと考えています。今まで私は、次のコードを書かれている:result_of、make_tuple、parameter pack

#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 answer](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>()...)); 
};