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.
Как это сделать?
Вы должны дать 'result_of' вызываемый объект, но вы фактически даете ему результат вызова функции. Вы можете использовать 'decltype' на своем месте. – BoBTFish
Зачем вам нужна сложная логика для обратного проектирования типа возврата 'make_tuple'? Это указано, и это не супер сложно. –
@KerrekSB: Я стараюсь избегать обратного проектирования возвращаемого типа 'make_tuple' и до сих пор не удалось. Но [T.C.s answer] (http://stackoverflow.com/questions/42001013/result-of-make-tuple-parameter-pack/42001110#42001110) - именно то, что я искал. –