代码之家  ›  专栏  ›  技术社区  ›  Nikola Smiljanić

使用声明包含未扩展的参数包

  •  3
  • Nikola Smiljanić  · 技术社区  · 7 年前

    如何编译此代码?

    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());
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Justin    7 年前

    using 在C++17中添加了参数包,因此您的代码 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

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

    推荐文章