【问题标题】:Using declaration contains unexpanded parameter pack使用声明包含未扩展的参数包
【发布时间】:2018-03-28 14:18:22
【问题描述】:

如何编译这段代码?

struct type1 {};
struct type2 {};

struct handler1
{
    void handle(type1){}
};

struct handler2
{
    void handle(type2){}
};

template <typename... Handlers>
struct TheHandler : Handlers...
{
    using Handlers::handle...; // DOESN'T COMPILE
};

TheHandler<handler1, handler2> handler;
handler.handle(type1());

【问题讨论】:

  • This works in C++17。它是在 C++17 中添加的(using 扩展参数包)。它在 C++14 中作为编译器扩展工作
  • @Justin 谢谢,但我暂时坚持使用 C++14。
  • 与所有参数包扩展一样,如果我没记错的话,你可以用递归重写它
  • 是的,您可以按照使用using:open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0195r1.html 提出参数包扩展的论文用递归重写它

标签: c++ c++11 c++14 variadic-templates using-declaration


【解决方案1】:

在 C++17 中添加了带有参数包的using,因此您的代码为would just work in C++17

作为 C++14 的一种解决方法,您可以使用递归。 The proposal for using... 展示了如何做到这一点:

template <typename Handler0, typename... Handlers>
struct TheHandler : Handler0, TheHandler<Handlers...>
{
    using Handler0::handle;
    using TheHandler<Handlers...>::handle;
};

template <typename Handler>
struct TheHandler<Handler> : Handler
{
    using Handler::handle;
};

On Godbolt

如果您愿意,可以实现对数递归深度。

【讨论】:

  • 如果TheHandler不应该继承Handler0,则将继承委托给包装类
  • @PasserBy True,但我认为这很好,因为它在问题中就是这样做的
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2022-01-19
  • 2020-07-17
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2016-06-18
相关资源
最近更新 更多