因此,我一直在尝试使用可变参数模板从更方便的子类型中组合对象,但是我很难使它完全按照我想要的方式工作。
template<class ...Functor>
struct SeqMethod:public Functor...{
template<class F>
void call(F& a){
F::operator()();
}
template<class F,class ... funcs>
void call(){
F::operator()();
call<funcs...>();
}
public:
void operator()(){
call<Functor...>();
}
};
这是无效的语法,因此就可以了。
理想情况下,我希望能够使用这样的东西
class A{
public:
void operator()(){
std::cout<<"A";
}
};
class B{
public:
void operator()(){
std::cout<<"B";
}
};
class C:public SeqMethod<A,B>{};
在这种情况下,应输出“ AB”,并且通常适合将行为组合在一起。
最简单的方法是使用C ++ 17的fold表达式:
template<class ...Functor>
struct SeqMethod:public Functor...{
public:
void operator()(){
(Functor::operator()(),...);
}
};
class A{
public:
void operator()(){
std::cout<<"A";
}
};
class B{
public:
void operator()(){
std::cout<<"B";
}
};
class C:public SeqMethod<A,B>{};
int main()
{
C c;
c();
return 0;
}
输出(经gcc 6.2测试):
AB
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句