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,很抱歉我没有时间检查标准——这又是你的工作,在提出问题之前阅读文档。
但作为解决手头问题(而不是语言问题)的实际问题,您始终可以递归地对其进行编码,而不是使用直接扩展。只需继承一个引入其余函子的类,然后引入第一个函子即可。其中“其余”是递归步骤,以空函子列表作为基本情况终止。