使用声明的变量扩展

HC4*_*ica 5 c++ overloading variadic-templates c++11

可能重复:
在可变参数模板中使用声明

我最近遇到了一个通用机制,用于组合两个函数对象以形成一个新的函数对象,其行为就像前两个被重载一样:

template <typename F1, typename F2>
struct overload : public F1, public F2
{
    overload(F1 f1, F2 f2) : F1(f1), F2(f2) {}

    using F1::operator();
    using F2::operator();
};
Run Code Online (Sandbox Code Playgroud)

我试图使用可变参数模板扩展这个想法以适用于N个函数对象:

template <typename... Fs>
struct overload : public Fs...
{
    overload(Fs... fs) : Fs(fs)... {}

    using Fs::operator();...
};
Run Code Online (Sandbox Code Playgroud)

但是,GCC抱怨我尝试在使用声明上进行可变扩展:

test.cpp:6:24: error: parameter packs not expanded with '...':
     using Fs::operator();...
                        ^
test.cpp:6:24: note:         'Fs'
test.cpp:6:26: error: expected unqualified-id before '...' token
     using Fs::operator();...
                          ^
Run Code Online (Sandbox Code Playgroud)

我尝试了一些变化,例如:

using Fs::operator()...;
Run Code Online (Sandbox Code Playgroud)

using Fs...::operator();
Run Code Online (Sandbox Code Playgroud)

但这个伎俩也没有.

是否有可能做到这一点?

Che*_*Alf -6

请提供参考资料,例如“我最近遇到Dave Abrahams 描述通用机制的博客文章”,而不是“我最近遇到了一个通用机制”……。

我怀疑语句是否支持参数包扩展using,很抱歉我没有时间检查标准——这又是你的工作,在提出问题之前阅读文档。

但作为解决手头问题(而不是语言问题)的实际问题,您始终可以递归地对其进行编码,而不是使用直接扩展。只需继承一个引入其余函子的类,然后引入第一个函子即可。其中“其余”是递归步骤,以空函子列表作为基本情况终止。

  • @Cheersandhth.-Alf:我认为你因为脾气暴躁而被否决了。就我个人而言,我主要根据内容和可读性进行投票,但有些用户可能也对形式敏感。 (8认同)
  • 我因脾气暴躁而投了反对票,因为答案的内容相当模糊 (4认同)