用inTemplates c ++中的类替换枚举

时间:2016-04-06 14:45:36

标签: c++ templates enums

我正面临以下问题。假设你有更深的继承。这是一些伪代码:

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}

以上代码大大简化了。在我的程序中,我有更多这样的情况,并且在更深层次的遗产中也存在同样的问题。

我的目标是最终创建一个简单的模板,它接受两个或多个枚举,然后将所有正确的继承添加到所有基类。

感谢您的帮助。

3 个答案:

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