【问题标题】:Simultaneous recursion over multiple parameter packs在多个参数包上同时递归
【发布时间】:2021-09-30 23:29:05
【问题描述】:

是否可以在 C++ 中同时递归多个(在我的情况下为两个)参数包?怎么样?

为了更好地了解我的要求,我目前有一个类模板如下:

template<template<typename> class C, typename... Rest>
class Inherit {};
template<template<typename> class C, typename T, typename... Rest>
class Inherit<C, T, Rest...> :
    public C<T>,
    public Inherit<C, Rest...>
{
};

我在另一个类中使用这个类模板,它采用参数包Ts 让该类从模板化接口多次继承。例如:

template<typename T>
class Interface
{
    ...
};

template<typename... Ts>
class Example :
    public Inherit<Interface, Ts...>
{
};

现在,我想做的是:

template<typename T, const char* N>
class Interface
{
    ...
};

template<typename... Ts, const char*... Ns>
class Example :
    public Inherit<Interface, Ts..., Ns...>
{
};

我需要一个模板化的Inherit 类,它可以递归并同时从TsNs 参数包中挑选一个元素(假设参数包TsNs 具有相同的长度)。我对模板编程不够精通,不知道这是否可能?

【问题讨论】:

  • 明确的继承链有什么意义?为什么不只是 template&lt;template&lt;typename&gt; class C, typename... Rest&gt; class Inherit : public C&lt;Rest&gt;... {}; 没有模板专业化?
  • Inherit 有一个typename... Rest。那只是类型除外。 Inherit 必须更改为看起来像 template&lt;template&lt;typename&gt; class C, typename T, typename... Rest, const char*... Ns&gt;

标签: c++ templates


【解决方案1】:

根据您提供的示例,我认为您不需要此 Inherit 类模板。下面是我如何写你的第一个例子:

template<typename T>
class Interface
{
    ...
};

template<typename... Ts>
class Example : public Interface<Ts>...
{
};

你的第二个例子:

template<typename T, const char* N>
class Interface
{
};

template<typename, const char*...>
class Example;

template<typename... Ts, const char*... Ns>
class Example<std::tuple<Ts...>, Ns...> : public Interface<Ts, Ns>...
{
};

【讨论】:

  • 正是我想要的。这甚至简化了我最初的解决方案。谢谢!
【解决方案2】:

template &lt;typename... Ts, const char*... Ns&gt; class Example; 错误。

你可能想要类似(无递归)

template<typename T, const char* N>
class Interface 
{
    // ...
};

template<typename T, typename Names> class Example;

template<typename... Ts, const char*... Ns>
class Example<std::tuple<Ts...>, std::integer_sequence<const char*, Ns...>> :
    public: Interface<Ts, Ns>...
{
};

Interface&lt;Ts, Ns&gt;... 要求两个包的大小相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多