使用声明的变量扩展

时间:2012-10-01 01:16:31

标签: c++ c++11 overloading variadic-templates

  

可能重复:
  using declaration in variadic template

我最近遇到a generic mechanism来组合两个函数对象以形成一个新的函数对象,其行为就像前两个函数对象一样重载:

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();
};

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

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

    using Fs::operator();...
};

然而,海湾合作委员会抱怨我试图在使用声明上进行可变扩展:

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();...
                          ^

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

using Fs::operator()...;

using Fs...::operator();

但这个伎俩也没有。

是否可以这样做?

1 个答案:

答案 0 :(得分:-3)

提供参考,而不是“我最近遇到了一个通用机制”,例如“我最近遇到了描述通用机制的blog posting by Dave Abrahams”....

我怀疑using声明是否支持参数包扩展,对不起,我没有时间检查标准 - 那是你的作业,到< em>在提出问题之前阅读文档。

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