c++ - 解决循环依赖

标签 c++ templates circular-dependency

我正在编写自己的小游戏引擎。 为了将选项菜单与主菜单和主游戏等分开,我想到了制作一个状态系统,上面提到的所有内容都是自己的状态。 引擎主循环在当前状态上调用 tick() 方法。 但是现在引擎对状态之间的交互、何时切换状态等一无所知。 为了解决这个问题,我实现了以下措施: 状态的 tick() 方法返回一个模板类型:commandset。 引擎获取事件处理程序来处理 tick() - 方法的返回值。 它看起来像这样:

    template<class StateHandler, typename FeedbackType>
    void Engine<StateHandler, FeedbackType>::run()
    {
        run = true;
        clock.restart();

        while (run)
        {
            sf::Time elapsed = clock.restart();
            Win->clear(sf::Color::Black);

            processEvents();

            if (!pause)
            {
                Handler(currentState->tick(elapsed), *this);
                if (overlayState != NULL)
                    Handler(overlayState->tick(elapsed), *this);
            }

            Win->display();
        }

    }

因此,引擎根据 tick 的返回值调用处理程序,并将自身传递给它。以便 Handler 可以与引擎进行交互。 (Variable Handler是StateHandler类型)

现在,当我想测试所有内容并编写一个 Teststate 和一个处理程序时,我遇到了麻烦。 对于以后的使用,我打算使用一个类作为处理程序,但为了简单的测试目的,我想使用一个函数。 所以当我想写这个函数时,我注意到,我不能定义第二个参数,引擎,因为它的模板参数将是函数的类型(这取决于引擎类型,这取决于函数类型...)。

现在我的问题是:如何定义处理程序?或者整个想法都是垃圾? (这真的很悲剧,因为我有点喜欢它)

最佳答案

一个函数是否工作量少到值得担心?

struct TestHandler {
    void operator ()(const CommandSet& cs, Engine<TestHandler, TestFeedback>& e) {
    }
};

如果你真的想要一个功能,你必须跳过箍。为了不正当的乐趣,我添加了一种方法来完成这项工作:

class any_ref {
public:
  template <typename T>
  any_ref(T& ref)
    : pointer(&ref)
#if !defined(NDEBUG)
    , type(&typeid(T))
#endif
  {}

  template <typename T>
  T& get() const {
    assert(typeid(T) == *type);
    return *static_cast<T*>(pointer);
  }

private:
  void* pointer;
#if !defined(NDEBUG)
  const std::type_info* type;
#endif
};

void TestHandler(const CommandSet& cs, any_ref er) {
  auto& e = er.get<Engine<void (*)(const CommandSet&, any_ref), TestFeedback>>();
}

关于c++ - 解决循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26100226/

相关文章:

c++ - OpenCL 内核 _local 内存行为不正确

C++ 生成器 10 CoreFondation.h(12) : 'Stdarg.h' file not found

具有默认参数的 C++ 模板参数

python - Django:渲染时出现 NoReverseMatch 错误

c++ - 将 void 函数模板专门化为 const char[N]

c++ - 如何在 C++ 中清空套接字读/写缓冲区

ios - Objective C,由于循环依赖导致的 Swift 互操作性问题

c++ - 如何避免实体和映射之间的循环依赖?

design-patterns - 类之间的循环依赖关系:为什么它们不好,以及如何消除它们?

c++ - decltype 错误 C2440 无法从 'int *' 转换为 'int *&'