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

3

我该如何让这段代码编译通过?

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
这在C++17中有效。它是在C++17中添加的(using扩展参数包)。作为编译器扩展,它在C++14中也可以工作。 - Justin
@Justin 谢谢,但我暂时被困在C++14中。 - Nikola Smiljanić
与所有参数包展开一样,如果我没记错的话,你可以使用递归来重写它。 - Passer By
1
是的,你可以按照提出使用“using”进行参数包扩展的论文,使用递归重写它:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0195r1.html - Justin
1个回答

4

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

在Godbolt上

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


1
如果TheHandler不应该继承Handler0,则将继承委托给包装类。 - Passer By
@路人甲 是的,但我认为这是可以的,因为这就是问题所要求的。 - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接