5

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

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

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

但是,GCC 抱怨我尝试对 using 声明进行可变参数扩展:

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

但也不行。

是否有可能做到这一点?

4

1 回答 1

-6

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

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

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

于 2012-10-01T01:50:15.963 回答