>我面临以下问题。假设你有一些更深层次的遗产。下面是一些伪代码:
class MeshEntity{ } // some entities are mesh entities
class SingleMeshEntity : MeshEntity { } // some entites use single meshes
class MultiMeshEntity : MeshEntity { } // some entities use multi meshes
template <class BASE> class CollisionMeshEntity : BASE // base is either SingleMeshEntity or MultiMeshEntity
假设你有一些枚举:
enum MESH_TYPE
{
SINGLE,
MULTI
}
是否可以创建使用以下模板(伪代码(的模板:
template<MESH_TYPE T> CollisionMeshEntity : if(T == SINGLE){SingleMeshEntity } else if (T == MULTI) {MultiMeshEntity}
上面的代码大大简化了。在我的程序中,我有更多这样的情况,并且在更深层次的继承中也有同样的问题。
我的目标是最终创建一个简单的模板,该模板需要两个或多个枚举,然后将所有正确的继承添加到所有基类。
谢谢你的帮助。
看看<type_traits>
std::conditional
.
它的工作方式非常简单:
std::conditional<true, int, float>::type
意味着int
。
std::conditional<false, int, float>::type
意味着float
。
因此,它根据第一个参数的值替换两种类型之一。
请记住,在某些情况下,编译器会要求您typename
关键字放在std::conditional<..>
.
实现一个根据 constexpr 值选择其基数的类留给读者作为练习。
您可以使用std::conditional
template <MESH_TYPE Base> class CollisionMeshEntity
: std::conditional_t<(Base == SINGLE), SingleMeshEntity, MultiMeshEntity>
{};
IIUC,你可以做如下的事情。
从基础课程开始:
#include <type_traits>
class MeshEntity{ }; // some entities are mesh entities
class SingleMeshEntity : MeshEntity { }; // some entites use single meshes
class MultiMeshEntity : MeshEntity { }; // some entities use multi meshes
和枚举:
enum MESH_TYPE
{
SINGLE,
MULTI
};
定义以下帮助程序结构:
template<MESH_TYPE MeshType>
struct mesh_type
{
typedef
typename std::conditional<
MeshType == SINGLE,
SingleMeshEntity,
MultiMeshEntity>::type
type;
};
现在,您几乎可以像使用任何类型一样使用它;对于继承:
class foo :
public mesh_type<SINGLE>::type
{};
或用于定义对象:
int main()
{
mesh_type<SINGLE>::type t0;
}