2016-04-06 6 views
2

私は次の問題に直面しています。もっと深い遺産があるとします。ここにいくつかの擬似コードは次のとおりです。クラスで列挙型を置き換えます.Templates C++

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} 

上記のコードは非常に単純化されています。私のプログラマーには、これ以上の状況があり、より深い継承にも同じ問題があります。

私の目的は、2つ以上の列挙型を取り、すべての基本クラスまですべての正しい継承を追加する単純なテンプレートを最終的に作成することです。

ありがとうございました。

答えて

2

std::conditional<type_traits>からご覧ください。

それが動作する方法は非常に簡単です:

std::conditional<true, int, float>::typeintを意味します。

std::conditional<false, int, float>::typeは、floatを意味する。

したがって、第1パラメータの値に基づいて2つのタイプのうちの1つを置き換えます。

状況によっては、typenameというキーワードをstd::conditional<..>の直前に配置する必要があります。


constexprの値に応じてベースを選択するクラスを実装することは、読者の練習として残されています。あなたはこのためstd::conditionalを使用することができます

+1

おかげで。それはまさに私が探していたものです。すべての答えが正しいので、私は最初のものを取る。 – kaiser

1

template <MESH_TYPE Base> class CollisionMeshEntity 
    : std::conditional_t<(Base == SINGLE), SingleMeshEntity, MultiMeshEntity> 
{}; 
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 
{};                                   

やオブジェクトを定義するための:あなたとすべての他のansersため

int main() 
{ 
    mesh_type<SINGLE>::type t0; 
} 
関連する問題