result_of, make_tuple, 参数包
result_of, make_tuple, parameter pack
我想获得 std::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。
如何做到?
template<class... Ts>
struct foo
{
using tuple_t = decltype(std::make_tuple(std::declval<Ts>()...));
};
我想获得 std::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。
如何做到?
template<class... Ts>
struct foo
{
using tuple_t = decltype(std::make_tuple(std::declval<Ts>()...));
};