从元组派生类

时间:2013-06-14 08:04:48

标签: c++ templates c++11 variadic-templates template-templates

我有一个像这样的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等等。

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

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

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

2 个答案:

答案 0 :(得分:4)

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

  1. T - 将被模板化,此参数我们将应用于tuple
  2. 中的参数
  3. std::tuple,其中包含可变数量的模板参数。
  4. 然后使用包扩展为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可以接受多个模板参数(当其他人首先有默认值时),代码不会失败。

    Example

答案 1 :(得分: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;

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

Live example.