从元组派生类

derive class from a tuple

本文关键字:派生 元组      更新时间:2023-10-16

我有一个std::元组,像这样:

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

现在,我想把t3_tuple转换成一个类似的元组:

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

在我的例子中,例如,t1, t2t3是原语,Tstd::stack。一般情况下,假设可能存在t4等。

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

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

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

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

  1. T -将被模板化,这个参数我们将应用于tuple
  2. 中的参数。
  3. 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可以接受多个模板参数(当其他但首先有默认值)。

示例

使用模板模板参数进行一点局部专门化就可以完成这项工作(推广到可变模板,而不仅仅是元组):

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)来模拟它。

生活例子。