如何向类发送回调

how to send a callback to a class

本文关键字:回调      更新时间:2023-10-16

我有一个类:market simulator,它有一个send_order(int qty, string symbol, double price)由我的xyz_strategy类调用的方法,这是一个正在测试的交易策略。当market_simulator收到订单时,它会检查市场价格并决定是否可以填写订单。它的标题是这样的:

class market_simulator {
std::vector<order> orders;
static std::shared_ptr<market_simulator> instance;
std::map<std::string,std::shared_ptr<instrument> > instruments;
...
public:
static std::shared_ptr<market_simulator> market();
... 
void send_order(int qty, std::string symbol, double price);
};

问题是我需要一种方法让market simulator将填充报告发回给发件人。

我的第一次尝试是将指向类的指针发送到市场模拟器。但是,市场模拟器必须包括"xyz_strategy"(和其他策略),然后它也可以访问其所有方法。

我的第二次尝试是创建一个虚拟超类order_sender,它有一个叫做fill_report(int qty, string symbol, double price)的方法。现在市场模拟器只知道order_sender,只能调用它的方法。但是现在战略有太多的超级类要实现。

如何在 c++ 中实现指向函数的指针,以便market_simulator只知道此函数并在执行时调用它?

编辑:要向其发送指针的函数如下所示:

void on_execution(int quantity, std::string symbol, double price);

你至少有两个回函数选项,1) 函数指针和 2)函数对象(函子)。

函数指针

使用指向函数的指针时,使用typedef通常会使程序更具可读性:

typedef void (*Function_Pointer)(const std::string&);

然后,您可以将函数指针传递给另一个函数:

void Logger(Function_Pointer output_function)
{
output_function("Hello");
}

函数对象

函数对象是重载operator()classstruct

struct Function_Object
{
void operator()(const std::string& text)
{
std::cout << text << "n";
}
};

您可以像传递任何其他对象一样传递函数对象:

void Logger_2(Function_Object& functor)
{
functor("Hello");
}

函数对象的一个很好的属性是,您可以为一系列回调定义抽象函数对象。

您可以使用函数指针或 lambda 表达式来委托所需的回调逻辑。

类似的东西;

void send_order(int qty, std::string symbol, double price, void (*callback));
// ...
send_order(1, "symbol", 1, []() -> void { // callback logic } )