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 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>()...)); 
}; 
Смежные вопросы