2016-04-06 17 views
2

ile değiştirin, aşağıdaki sorunla karşı karşıyayım. Daha derin bir mirasın olduğunu söyle.Enum'u sınıf inTemplates C++

template<MESH_TYPE T> CollisionMeshEntity : if(T == SINGLE){SingleMeshEntity } else if (T == MULTI) {MultiMeshEntity} 

:

enum MESH_TYPE 
{ 
    SINGLE, 
    MULTI 
} 

şablon (pseude kodu) Aşağıdaki kullanan bir şablon oluşturmak mümkün mü:

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 

bazı enum var Diyelim: Burada bazı sözde kodu Yukarıdaki kod çok basitleştirilmiştir. Benim programımda bunun gibi daha fazla duruma ve aynı zamanda daha derin miraslarda da aynı problemlere sahibim.

Amacım, sonunda iki veya daha fazla numarayı alan basit bir Şablon oluşturmak ve tüm temel sınıflara kadar tüm doğrulıklar eklemektir.

Yardımlarınız için teşekkür ederiz.

cevap

2

'dan <type_traits>'a bakın. Çalışır

yolu çok basit:

std::conditional<true, int, float>::typeint anlamına gelir.

std::conditional<false, int, float>::typefloat. Böylece, ilk parametrenin bir değerine dayalı olarak iki tipten birini ikame eder.

Bazı bağlamlarda derleyicinin anahtar sözcüğünü std::conditional<..>'dan hemen önce koymanızı gerektirdiğini unutmayın. olmasını isterse bir sınıf uygulama


okuyucuya bir egzersiz kalan bir constexpr değerine bağlı olarak üs.

+1

teşekkür senin ve diğer tüm ansers. Tam olarak aradığım şey bu. Bütün cevaplar doğru olduğu için ilkini ben alırım. – kaiser

1

Bunun için std::conditional kullanabilirsiniz:

template <MESH_TYPE Base> class CollisionMeshEntity 
    : std::conditional_t<(Base == SINGLE), SingleMeshEntity, MultiMeshEntity> 
{}; 
1

IIUC, aşağıdakilerden gibi bir şey yapabilirsiniz.

temel sınıfları ile başlayan:

#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 

ve enum:

enum MESH_TYPE 
{ 
    SINGLE, 
    MULTI 
}; 

aşağıdaki yardımcı yapı tanımlayın:

template<MESH_TYPE MeshType> 
struct mesh_type 
{ 
    typedef 
     typename std::conditional< 
      MeshType == SINGLE, 
      SingleMeshEntity, 
      MultiMeshEntity>::type 
     type; 
}; 

artık hemen hemen her tip gibi kullanabilirsiniz; miras için:

class foo : 
    public mesh_type<SINGLE>::type 
{};                                   

ya tanımlayan nesneler için: için

int main() 
{ 
    mesh_type<SINGLE>::type t0; 
}