64,647
社区成员
发帖
与我相关
我的任务
分享
Sdk::~Sdk()
{
delete event_;
}
#include <iostream>
#include <string>
//////////////////////////////////////////////////////////////////////////
//delegate 2
template <typename result_type, typename argument_type1, typename argument_type2>
class BinaryDelegate
{
public:
virtual ~BinaryDelegate(void) {}
virtual result_type operator()(argument_type1 arg1, argument_type2 arg2) = 0;
};
template <typename concrete_type, typename result_type, typename argument_type1, typename argument_type2>
class BinaryDelegateImpl : public BinaryDelegate<result_type, argument_type1, argument_type2>
{
typedef result_type (concrete_type::*func)(argument_type1, argument_type2);
concrete_type* c_;
func func_;
public:
BinaryDelegateImpl(concrete_type* c, func f) : c_(c), func_(f) {}
virtual result_type operator()(argument_type1 arg1, argument_type2 arg2)
{
if (c_ != 0)
return (c_->*func_)(arg1, arg2);
}
};
template <typename concrete_type, typename result_type, typename argument_type1, typename argument_type2>
BinaryDelegate<result_type, argument_type1, argument_type2>*
make_binary_delegate(concrete_type* c, result_type (concrete_type::* f)(argument_type1, argument_type2))
{
return new BinaryDelegateImpl<concrete_type, result_type, argument_type1, argument_type2>(c, f);
}
//////////////////////////////////////////////////////////////////////////
//sdk
class Sdk
{
public:
BinaryDelegate<void, int, std::string>* event_;
// 请注意,因为在本类中会调用event_,设计者必须知道其原型,因此在此处指定函数返回值和参数类型是合适的
Sdk(): event_(0) {}
void open()
{
std::cout << "opened" << std::endl;
if (event_ != 0)
(*event_)(100, "你好");
}
};
class Client
{
private:
Sdk sdk_;
public:
Client()
{
sdk_.event_ = make_binary_delegate(this, &Client::on_open2);
}
void open()
{
sdk_.open();
}
void on_open()
{
std::cout << "Open event fired" << std::endl;
}
void on_open2(int t, std::string str)
{
std::cout << "Open event fired, Argument = " << t << "Argument2 = " << str << std::endl;
}
};
int main()
{
Client client;
}