变异模板函数调用

时间:2016-12-23 23:20:14

标签: c++ variadic-templates object-composition

所以我一直在尝试使用可变参数模板从更方便的子类型中组合对象,但是我很难让它完全按照我想要的方式进行。

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”,并且通常适合于一起组合行为。

2 个答案:

答案 0 :(得分:6)

在您的情况下,您实际上不需要任何call成员函数 相反,您可以在C ++ 11 / C ++ 14中执行此操作:

template<class ...Functor>
struct SeqMethod:public Functor...{
  public:
  void operator()(){
      int _[] = { (Functor::operator()(), 0)... };
      return void(_);
  }
};

它遵循一个最小的工作示例:

#include<iostream>

template<class ...Functor>
struct SeqMethod:public Functor...{
  public:
  void operator()(){
    int _[] = { (Functor::operator()(), 0)... };
    return void(_);
  }
};

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

答案 1 :(得分:3)

最简单的方法是使用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