C++ 委托模板
C++ delegate template
如果我有以下设置,仅举个例子。我遇到的问题是让模板的连接功能起作用。
class A
{
public:
Delegate<void(int)> test;
};
class B
{
public:
void test(int a)
{
std::cout << a;
};
};
我想将其与以下内容联系起来:
a.test.connect(&b, &B::test);
然后classa的实例可以在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);
}
如果我有以下设置,仅举个例子。我遇到的问题是让模板的连接功能起作用。
class A
{
public:
Delegate<void(int)> test;
};
class B
{
public:
void test(int a)
{
std::cout << a;
};
};
我想将其与以下内容联系起来:
a.test.connect(&b, &B::test);
然后classa的实例可以在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);
}