对于即将在一月份的课程作业,我开始开发一个小型 DirectX 引擎。为了确定是否有性能提升,我想尝试根本不使用任何虚拟设备(我知道虚拟设备并不全是坏事,但我只是想看看没有它们是否可能)。
当我开始使用简单的 StateManager 时,很难避免虚拟,但这是我目前的方法:
#include <boost\function.hpp>
#include <boost\bind.hpp>
template <class Derived>
struct TBaseState {
bool update(float delta) {
return static_cast<Derived *>(this)->update(delta);
};
};
struct CTestState : TBaseState<CTestState> {
bool update(float delta) {
return true;
}
};
class StateManager
{
public:
template <class StateClass> static void setState(StateClass nextState)
{
m_funcptrUpdate = boost::bind(&TBaseState<StateClass>::update, boost::ref(nextState), _1);
}
static bool update(float delta)
{
return m_funcptrUpdate(delta);
}
protected:
private:
static boost::function<bool (float)> m_funcptrUpdate;
};
Visual Studio 2010 的 Intellisense 似乎认为一切都很好,但是当我想编译程序并使用非常基本的方法测试 StateManager 时:
CTestState* t = new CTestState();
StateManager::setState(*t);
StateManager::update(0.0f);
在链接阶段抛出以下错误:
error LNK2001: unresolved external symbol "private: static class boost::function<bool __cdecl(float)> StateManager::m_funcptrUpdate" (?m_funcptrUpdate@StateManager@@0V?$function@$$A6A_NM@Z@boost@@A)
所以很明显他找不到绑定的功能,但是我该如何解决这个问题呢?如果我直接使用 boost::bind 到某个类,我会得到类似的错误。由于我是一名计算机科学专业的学生,因此我也会对一些无需提升的见解或方法感兴趣(例如 bind1st,...)。
编辑:我也在考虑使用 C++11 Variadic Templates,但课程要求之一是坚持 VS2012。