如何将回调发送给一个类

时间:2017-03-23 14:06:27

标签: c++ architecture

我有一个类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);

2 个答案:

答案 0 :(得分:0)

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

功能指针

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

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

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

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

功能对象

函数对象是classstruct,它会重载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 } )