【问题标题】:Initialize tuple with class templated on each type of variadic template使用在每种类型的可变参数模板上模板化的类初始化元组
【发布时间】:2026-01-09 07:50:01
【问题描述】:

标题可能很难解析,所以这就是我的意思。假设我有几个 A、B1、B2、B3 ...... Bn 类,我想在某个 B 类上保存一个 A 的元组模板。有效的最终结果可能类似于tuple<A<B3>, A<B1>> _chain。这将包含在我们称为 C 的容器类中。我正在寻找的是用一堆 B 类型初始化 C,然后将它们包装在我的 A 类中。我不能简单地做

template<class... T>
class C
{
    std::tuple<T...> _chain;
public:
    C(const T&... t) : _chain(t...) { }
};

因为那样我最终会得到一个 Bs 元组。是否有符合人体工程学的方法来包装 init 步骤 (_chain(t...)),这样我最终将在传递给该类的 B 类上得到一个模板化的 A 元组?

【问题讨论】:

    标签: c++ c++11 c++14 c++17 stdtuple


    【解决方案1】:

    你的意思是这样的:

    template<template <typename> typename Base, class... T>
    class C
    {
        std::tuple<Base<T>...> _chain;
    public:
        C(const Base<T>&... t) : _chain(t...) { }
    };
    

    你可以这样使用它:C&lt;A, B1, B2, B3&gt; c;

    _chain 将成为一个元组 tuple&lt;A&lt;B1&gt;, A&lt;B2&gt;, A&lt;B3&gt;&gt;

    【讨论】:

    • 非常有趣,看起来可以。如果这个特定的类 C 总是要使用 A 来作为模板呢?是否可以消除指定 A 的需要?
    • @Keltek 当然。只需从模板签名中删除template &lt;typename&gt; typename Base 并将类中的Base 替换为A
    • 我会试一试,然后回复你。回想起来,这太明显了。