将枚举替换为模板 c++ 中的类

Replace enum by class inTemplates c++

本文关键字:c++ 枚举 替换      更新时间:2023-10-16

>我面临以下问题。假设你有一些更深层次的遗产。下面是一些伪代码:

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;
}