我最近得到了這個想法,使用CRTP(奇怪的循環模板模式)分離不同平臺的具體實現(可能是Win32/X,opengl/dx/vulkan等):我想大概是這樣:使用CRTP分離平臺特定的代碼
IDisplayDevice.h
#pragma once
#include "OSConfig.h"
namespace cbn
{
template <class TDerived> // Win32 type here
struct IDisplayDevice
{
bool run_frame(void) {
return
static_cast<const TDerived*>(this)->run_frame();
}
// a lot of other methods ...
};
}
Win32DisplayDevice.h:
#pragma once
#include "OSConfig.h"
// make sure it only gets compiled on win32/64
#if defined(CBN_OS_WINDOWS)
namespace cbn
{
class CWin32DisplayDevice
: public IDisplayDevice<CWin32DisplayDevice> {
public:
bool run_frame(void) {
call_hInstance();
call_hWnd();
#ifdef CBN_RENDERAPI_DX11
call_dx11_bufferswap();
#endif
return some_state;
}
private:
};
}
#endif
然後,我會在XDisplayDevice.h中以相同的方式提供其他實現。 最後,我會做一個公共接口DisplayDevice.h:
#include "Win32DisplayDevice.h"
#include "XDisplayDevice.h"
namespace cbn
{
class CDisplayDevice
{
public:
CBN_INLINE
bool run_frame(void) { return device_->run_frame(); }
private:
#if defined(CBN_OS_WINDOWS)
CWin32DisplayDevice device_;
#elif defined(CBN_OS_LINUX)
CXDisplayDevice device_;
#elif // and so on
#else
// does nothing ...
CNillDisplayDevice device_;
#endif
}
}
所以,我可以把它在main.cpp中,如:
int main()
{
CDisplayDevice my_device;
while(my_device->run_frame())
{
do_some_magic();
}
}
你認爲這將是一個處理平臺特定代碼的好方法? PS:由於平臺約束(android,ps4等),我避免了victuals和多態,其中指針調用很重要。
爲了使用CRTP的,你需要從'IDisplayDevice派生'。 –
他們有多重要_do_(指針通過vtables調用)?你有具體的限制或要求嗎? – utnapistim
oops;抱歉;我剛纔寫了這段代碼(不是複製粘貼):) – Coder32