为成员函数定义代理,该成员函数将成员函数指针作为模板参数

时间:2019-07-26 20:35:20

标签: c++ templates

我正在使用带有这样声明的类的第三方库:

template<typename Ret, typename... Args>
class Delegate<Ret(Args...)>
{
  // ...
};

,它具有一些具有2个模板参数的模板成员函数。第一个参数是类类型,第二个参数是成员函数指针:

template<typename Class, Ret(Class:: *Member)(Args...) const>
void connect(Class *instance);

template<typename Class, Ret(Class:: *Member)(Args...)>
void connect(Class *instance);

然后像这样使用它:

class A
{
  void f(int)
  { }

  void foo()
  {
    Delegate<void(int)> d;
    d.connect<A, &A::f>(this);
  }
};

我想创建一个代理模板函数MyConnect,该函数仅将参数转发到Delegate's connect

class A
{
  void f(int)
  { }

  void foo()
  {
    MyConnect<A, &A::f>(this);
  }

  template <???>
  void MyConnect(???)
  {
    Delegate<void(int)> d;
    d.connect<???, ???>(this);
  } 
};

我无法执行此template <typename Class, void(Class::*Member)(int)>,因为我不知道返回类型是什么,也不知道函数参数的数量

1 个答案:

答案 0 :(得分:2)

对于C ++ 17,您可以使用auto

template <typename C, auto m>
void MyConnect()
{
    Delegate<void(int)> d;
    d.connect<C, m>(this);
}