我一直在计划为我的渲染引擎编写一个 API 抽象层。我想要包含的两个 API 是 D3D11 和 D3D12。因此,我首先为每个 API 编写了一些接口及其各自的实现。
以下代码片段对此进行了举例说明:
class IDevice
{
//... (pure) virtual methods
};
class CD3D11Device : public IDevice
{
//... virtual method implementations
};
class CD3D12Device : public IDevice
{
//... virtual method implementations
};
到目前为止,一切都很好。现在到实际问题:如果我有另一个接口,其中的方法需要一个IDevice*
as 参数,我如何确保传递“正确”的设备?
class ISomeClass
{
public:
virtual void foo(IDevice* pDev) = 0;
};
class CD3D11SomeClass : public ISomeClass
{
public:
virtual void foo(IDevice* pDev) override
{
// should only be passed CD3D11Device
}
};
class CD3D12SomeClass : public ISomeClass
{
public:
virtual void foo(IDevice* pDev) override
{
// should only be passed CD3D12Device
}
};
我知道我可以每次都调用指针并进行检查,dynamic_cast
但这在性能方面既乏味又昂贵。IDevice*
nullptr
这个问题有一些优雅的解决方案吗?你们中有人知道专业/商业游戏引擎是如何应对的吗?