我最近遇到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();
但这个伎俩也没有。
是否可以这样做?
答案 0 :(得分:-3)
请提供参考,而不是“我最近遇到了一个通用机制”,例如“我最近遇到了描述通用机制的blog posting by Dave Abrahams”....
我怀疑using
声明是否支持参数包扩展,对不起,我没有时间检查标准 - 那是你的作业,到< em>在提出问题之前阅读文档。
但是作为解决手头问题的实际问题(而不是语言问题),您总是可以递归编码而不是使用直接扩展。只需继承一个引入其余仿函数的类,然后引入第一个仿函数。其中“其余”是递归步骤,终止于一个空的仿函数列表作为基本情况。