如果我具有以下设置,请仅作为示例。我的问题是使模板的连接功能正常工作。
class A
{
public:
Delegate<void(int)> test;
};
class B
{
public:
void test(int a)
{
std::cout << a;
};
};
我想将此与以下内容连接:a.test.connect(&b, &B::test);
然后,类A的实例可以在class B
的实例上调用测试函数。
我有以下模板,但是在捕获所需的实例和功能时遇到问题。
#ifndef DELEGATE_H
#define DELEGATE_H
#include <functional>
template<class _Delegate>
class Delegate;
template<class R, class... Args>
class Delegate<R(Args...)>
{
public:
template<typename T>
void connect(T* t, R(Args... ) )
{
mFunction = std::function(T::*t, R(Args...));;
}
R operator()(Args... args)
{
return mFunction(args...);
}
protected:
std::function<R(Args...)> mFunction;
};
#endif
您的connect()
应该写成如下
template<typename T>
void connect (T * t, R(T::*method)(Args...) )
{ mFunction = [=](Args ... as){ (t->*method)(as...); }; }
以下是完整的编译示例
#include <iostream>
#include <functional>
template <typename>
class Delegate;
template <typename R, typename... Args>
class Delegate<R(Args...)>
{
public:
template<typename T>
void connect (T * t, R(T::*method)(Args...) )
{ mFunction = [=](Args ... as){ (t->*method)(as...); }; }
R operator() (Args... args)
{ return mFunction(args...); }
protected:
std::function<R(Args...)> mFunction;
};
class A
{ public: Delegate<void(int)> test; };
class B
{ public: void test (int a) { std::cout << a; }; };
int main()
{
A a;
B b;
a.test.connect(&b, &B::test);
a.test(42);
}