因此,我一直在尝试使用可变参数模板来从更方便的子类型中组合对象,但是我很难使它准确地完成我想要的事情。

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 expressions:

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

关于c++ - 可变参数模板仿函数调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41308868/

10-09 17:17