Использование объявления содержит нерасширенный пакет параметров

Как мне получить этот код для компиляции?

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 ответ

Решение

using с пакетами параметров был добавлен в C++17, поэтому ваш код будет работать только в C++ 17.

В качестве обходного пути для C++14 вы можете использовать рекурсию. Предложение для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;
};

На Годболте

Можно достичь глубины логарифмической рекурсии, если вы хотите это сделать.

Другие вопросы по тегам