我正面临以下问题。假设你有更深的继承。这是一些伪代码:
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
}
是否可以创建使用以下模板的模板(pseude代码):
template<MESH_TYPE T> CollisionMeshEntity : if(T == SINGLE){SingleMeshEntity } else if (T == MULTI) {MultiMeshEntity}
以上代码大大简化了。在我的程序中,我有更多这样的情况,并且在更深层次的遗产中也存在同样的问题。
我的目标是最终创建一个简单的模板,它接受两个或多个枚举,然后将所有正确的继承添加到所有基类。
感谢您的帮助。
答案 0 :(得分:2)
从std::conditional
了解<type_traits>
。
它的工作方式非常简单:
std::conditional<true, int, float>::type
表示int
。
std::conditional<false, int, float>::type
表示float
。
因此,它根据第一个参数的值替换两种类型中的一种。
请注意,在某些情况下,编译器会要求您在typename
之前放置std::conditional<..>
关键字。
根据constexpr值实现一个选择它的类的类留给读者。
答案 1 :(得分:1)
您可以使用std::conditional
:
template <MESH_TYPE Base> class CollisionMeshEntity
: std::conditional_t<(Base == SINGLE), SingleMeshEntity, MultiMeshEntity>
{};
答案 2 :(得分:1)
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;
}