【问题标题】:derive class from a tuple从元组派生类
【发布时间】:2013-06-14 08:04:47
【问题描述】:

我有一个像这样给出的 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</*???*/>;

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

【问题讨论】:

  • 我认为这个问题不仅与tuple 相关,而且通常适用于可变参数模板。

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


【解决方案1】:

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

  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 可以接受多个模板参数(当其他但第一个具有默认值时),代码不会失败。

Example

【讨论】:

  • 我觉得可以提一下模板模板参数这个词并给出一些解释...
  • @jogojapan, “我认为提一下模板模板参数这个词会很好” - 会吗?我们不在任何地方使用它。
  • @soon 这只是一个归纳声明,对吧?只是为了好玩:你知道完全避免使用 class 关键字是否正确吗?
  • @soon: template&lt;class&gt; class T 是一个模板,作为一个模板的参数,它是一个模板模板参数。 :) 另请注意,对于带有多个参数的类模板,您的代码将失败,但除第一个参数之外的每个人都有默认值(如标准序列容器)。
  • @soon 不确定我是否理解。但我的观点是,答案似乎只包含代码。我也赞成使用语言来解释事物的答案。你显然可以不同意。
【解决方案2】:

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

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

Live example.

【讨论】:

  • 您能否详细说明为什么这可能不适用于 MSVC?他们不使用“真正的可变参数模板”是什么意思?
  • @Johannes:MSVC 的标准库使用template&lt;class T1 = _Nil, class T2 = _Nil, ...&gt; class tuple;,然后在一定限度内使用部分特化来模拟可变参数模板。 tuple&lt;T1, T2&gt; 上使用的上述特征将导致 tuple&lt;X&lt;T1&gt;, X&lt;T2&gt;, X&lt;_Nil&gt;, X&lt;_Nil&gt;...&gt; 将一切搞砸。
  • 这是 MSVC 的不当行为,将来可能会被他们修复?
  • @Johannes:当然,如果他们支持可变参数模板的话。 :) 标准要求元组实现为template&lt;class... Args&gt; class tuple;
  • @Johannes:你的意思是没有任何元功能,只使用别名?不,因为标准库中还没有这样的功能。
猜你喜欢
  • 1970-01-01
  • 2017-12-28
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2021-06-18
相关资源
最近更新 更多