我正在 mock 在C++中实现策略模式的最佳方法。到目前为止,我一直使用标准方法,其中上下文具有指向基本策略类的指针,如下所示:

 class AbstractStrategy{
 public:
     virtual void exec() = 0;
 }
 class ConcreteStrategyA{
 public:
     void exec();
 }
 class ConcreteStrategyB{
 public:
     void exec();
 }

 class Context{
 public:
     Context(AbstractStrategy* strategy):strategy_(strategy){}
     ~Context(){
          delete strategy;
       }
      void run(){
           strategy->exec();
      }
 private:
     AbstractStrategy* strategy_;

由于具有指向对象的指针可能导致不良行为,因此我一直在寻找一种更安全的方式来实现此模式,并且我发现this question提出了std::function作为处理此模式的更好方法。

有人可以通过策略模式示例更好地解释std::function的工作原理吗?

最佳答案

请注意,单方法对象与函数同构,策略只是单方法对象。

因此,基本上,您摆脱了所有类,而只使用了std::function<void()>:

class Context {
public:
    template<typename F>
    explicit Context(F strategy) : strategy(std::move(strategy)) { }

    void run() { strategy(); }

private:
    std::function<void()> strategy;
};

然后,您可以将任何可调用项传递给Context的构造函数:
Context ctx([] { std::cout << "Hello, world!\n"; });
ctx.run();

关于c++ - 如何使用std::function在C++中实现策略模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29031782/

10-16 04:58