Недавно я получил эту идею для разделения различных реализаций на платформе (может быть Win32/X, opengl/dx/vulkan и т. Д.) С использованием CRTP (любопытно повторяющийся шаблон шаблона): я думал что-то вроде этого:Использование 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 и т. Д.), Где указатель вызывает материю.
Для того, чтобы использовать CRTP, вам необходимо получить от 'IDisplayDevice '. –
Сколько _do_ они имеют значение (вызов указателя через vtables)? У вас есть конкретные ограничения или требования? – utnapistim
oops; Прости; Я написал этот код только сейчас (не был скопирован) :) – Coder32