3

我有一个这样的 std::tuple :

typedef std::tuple<t1, t2, t3> tuple_t;

现在,我想将 t3_tuple 转换为类似的元组:

typedef std::tuple< T<t1>, T<t2>, T<t3> > derived_tuple_t;

例如,在我的情况下,t1t2t3是原语,并且Tstd::stack。一般来说,假设可能有t4等等。

当然,我的第二个定义已经解决了这个问题,但我希望推导是自动的:只给定Tand tuple_t,构建我derived_tuple_t。像这样:

template <class T, class tuple_t> using derived_tuple_t = std::tuple</*???*/>;

这样的事情可能吗?也许是一个简短的解决方案?

4

2 回答 2

4

update_tuple您可以使用两个模板参数声明 struct :

  1. T- 将被模板化,这个参数我们将应用到参数中tuple
  2. std::tuple具有可变数量的模板参数。

然后只需使用使用包扩展tuple应用的参数为新创建一个别名T

#include <tuple>
#include <type_traits>
#include <vector>

template <template<class...> class, class>
struct update_tuple;

template <template <class...> class T, class... Args>
struct update_tuple<T, std::tuple<Args...>>
{
    using type = std::tuple<T<Args>...>;
};

int main()
{
    static_assert
    (
        std::is_same
        <
            std::tuple<std::vector<int>, std::vector<double>>,
            update_tuple<std::vector, std::tuple<int, double>>::type
        >::value,
        "They are not same"
    );
    return 0;
}

感谢@Xeo:如果T可以接受多个模板参数(当其他但首先具有默认值时),代码将不会失败。

例子

于 2013-06-14T08:28:13.833 回答
3

使用模板模板参数的一点部分专业化应该可以完成这项工作(推广到可变参数模板,而不仅仅是元组):

template<template<class...> class TT, class ArgsT>
struct make_over;

template<template<class...> class TT, template<class...> class ArgsT, class... Ts>
struct make_over<TT, ArgsT<Ts...>>{ using type = ArgsT<TT<Ts>...>; };

template<template<class...> class TT, class ArgsT>
using MakeOver = typename make_over<TT, ArgsT>::type;

请注意,这对于不使用真正可变参数模板的标准库可能会出现问题,而是使用宏机制和默认模板参数(如 MSVC)来模拟它。

活生生的例子。

于 2013-06-14T08:29:31.167 回答