2016-03-07 2 views
3

J'ai plusieurs types créés à l'aide des politiques, à savoirspécialisation select de classe modèle en utilisant une chaîne

template <typename PolicyA, typename PolicyB> 
class BaseType : PolicyA, PolicyB 
{}; 

struct MyPolicyA {}; 
struct MyPolicyB {}; 
struct OtherPolicyB {}; 

using SpecializedTypeX = BaseType<MyPolicyA, MyPolicyB>; 
using SpecializedTypeY = BaseType<MyPolicyA, OtherPolicyB>; 

Maintenant, je voudrais vous présenter un mécanisme qui me permet d'élégance de sélection qui SpecializedType doit être utilisé se basant sur les commentaires de par exemple ligne de commande. Idéalement, ce serait une méthode d'usine créant un objet du type approprié, comme:

auto CreateSelectedSpecializedType(const std::string &key); 

// selected has type SpecializedTypeX 
auto selected = CreateSelectedSpecializedType("SpecializedTypeX"); 

J'apprécierais tout conseil. Merci!

+2

Quel type '' CreateSelectedSpecializedType' retournerait? 'BaseType ' et 'BaseType ' sont des types non apparentés. Si les instanciations 'BaseType' sont toutes héritées de' RootClass', alors vous pouvez retourner un 'std :: unique_ptr ' et avoir un mappage simple des chaînes vers les fonctions de création. – TartanLlama

+0

@TartanLlama Vous avez raison, c'est ce que je vais faire. Merci! – pzelasko

Répondre

2

Il est impossible de faire dépendre un type C++ de données d'exécution, car les types sont fixés statiquement au moment de la compilation. Par conséquent, il est impossible de rendre un type de retour d'une fonction dépendant des valeurs des arguments d'entrée. Donc, la meilleure chose que vous pouvez faire est probablement de créer une classe de base commune pour toutes les politiques, par exemple:

struct CommonBase {}; 
template <typename PolicyA, typename PolicyB> 
class BaseType : CommonBase, PolicyA, PolicyB {}; 

struct MyPolicyA {}; 
struct MyPolicyB {}; 
struct OtherPolicyB {}; 

using SpecializedTypeX = BaseType<MyPolicyA, MyPolicyB>; 
using SpecializedTypeY = BaseType<MyPolicyA, OtherPolicyB>; 

CommonBase * createObjectOfType(std::string const & type) { 
    if (type == "SpecializedTypeX") 
     return new SpecializedTypeX(); 
    if (type == "SpecializedTypeY") 
     return new SpecializedTypeY(); 
    // etc... 
    return nullptr; 
} 
+1

Aussi, je recommanderais de retourner un 'std :: unique_ptr' pour que la propriété soit évidente. – TartanLlama