gpt4 book ai didi

c++ - 解决循环依赖

转载 作者:行者123 更新时间:2023-11-30 04:00:47 25 4
gpt4 key购买 nike

我正在编写自己的小游戏引擎。为了将选项菜单与主菜单和主游戏等分开,我想到了制作一个状态系统,上面提到的所有内容都是自己的状态。引擎主循环在当前状态上调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com