我有一个类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);
答案 0 :(得分:0)
回调函数至少有两个选项,1)函数指针和2)函数对象(仿函数)。
使用指向函数的指针时,使用typedef
通常会使程序更具可读性:
typedef void (*Function_Pointer)(const std::string&);
然后,您可以将函数指针传递给另一个函数:
void Logger(Function_Pointer output_function)
{
output_function("Hello");
}
函数对象是class
或struct
,它会重载operator()
。
struct Function_Object
{
void operator()(const std::string& text)
{
std::cout << text << "\n";
}
};
您可以像任何其他对象一样传递函数对象:
void Logger_2(Function_Object& functor)
{
functor("Hello");
}
函数对象的一个很好的属性,你可以为一系列回调定义抽象函数对象。
答案 1 :(得分:0)
您可以使用函数指针或lambda表达式来委派您想要的回调逻辑。
喜欢的东西;
void send_order(int qty, std::string symbol, double price, void (*callback));
// ...
send_order(1, "symbol", 1, []() -> void { // callback logic } )