优点:
1处修改,到处使用。
2.编译器间编译,运行效率更高。
#define PRINT_TRACE (std::cout << __FUNCTION__ << __LINE__ << std::endl)
class FRHIResource
{
public:
FRHIResource() { PRINT_TRACE; }
~FRHIResource() { PRINT_TRACE; }
};
class FRHIUniformBuffer : public FRHIResource
{
public:
FRHIUniformBuffer() :FRHIResource() { PRINT_TRACE; }
~FRHIUniformBuffer() { PRINT_TRACE; }
};
typedef FRHIUniformBuffer* FUniformBufferRHIParamRef;
class FD3D11UniformBuffer : public FRHIUniformBuffer
{
public:
FD3D11UniformBuffer() :FRHIUniformBuffer() { PRINT_TRACE; }
~FD3D11UniformBuffer() { PRINT_TRACE; }
};
//----
class FRHITexture : public FRHIResource
{
public:
FRHITexture() :FRHIResource() { PRINT_TRACE; }
~FRHITexture() { PRINT_TRACE; }
};
class FRHITextureCube : public FRHITexture
{
public:
FRHITextureCube() :FRHITexture() { PRINT_TRACE; }
~FRHITextureCube() { PRINT_TRACE; }
};
typedef FRHITextureCube* FRHITextureCubeRHIParamRef;
class FD3D11TextureCube : public FRHITextureCube
{
public:
FD3D11TextureCube() :FRHITextureCube() { PRINT_TRACE; }
~FD3D11TextureCube() { PRINT_TRACE; }
};
//------------
template<class T>
struct TD3D11ResourceTraits
{
};
template<>
struct TD3D11ResourceTraits<FRHIUniformBuffer>
{
typedef FD3D11UniformBuffer TConcreteType;
};
template<>
struct TD3D11ResourceTraits<FRHITextureCube>
{
typedef FD3D11TextureCube TConcreteType;
};
template<typename TRHIType>
static __forceinline typename TD3D11ResourceTraits<TRHIType>::TConcreteType* ResourceCast(TRHIType * Resource)
{
return static_cast<typename TD3D11ResourceTraits<TRHIType>::TConcreteType*>(Resource);
}
FRHITextureCubeRHIParamRef BufferRHI = new FD3D11TextureCube();
/*
封装到一个工厂方法中。Factory.Execute(BufferRHI);
void Execute(BufferRHI)
{
bool bRet = true;
ResourceCast(BufferRHI)!=nullptr ?ResourceCast(BufferRHI)->DoTask():bRet = false;
}
//用这个方法,只要用到了派生类就要显示的编码出具体类。如果一个具体类名发生改动,那么所有用到的地方都需要改动。而用上面的代码只需要改动一次,多次使用。
void Execute(BufferRHI)
{
bool bRet = true;
static_cast<FD3D11TextureCube *>(BufferRHI)!=nullptr ?static_cast<FD3D11TextureCube *>(BufferRHI)->DoTask():bRet = false;
static_cast<FD3D11UniformBuffer *>(BufferRHI)!=nullptr ?static_cast<FD3D11UniformBuffer *>(BufferRHI)->DoTask():bRet = false;
}
*/
if (BufferRHI)
{
delete BufferRHI;
BufferRHI = nullptr;
}
总结:
根据基类指针转换为具体的派生类指针。
能够根据传入的不同的基本类指针转换为不同的派生类。
优点:
1.能够利用编译器编译期间检查基础类转换为派生类这个派生类是否是从这个基础类中派生出来。
2.比利用dynamic_cast有更好的编译期间检查,使用dynamic_cast 类必须含有多态类类型,对于没有多态类类型无法进行转换。
3.对外暴露的接口简单化,更具有统一性,更好进行维护。
4.应用时候不必硬编码显示的进行类型转换。尽可能增大代码的复用和改动,增强代码的强度。