2012-02-20 6 views
0

J'ai plusieurs types de formats qui ont chacun un nom et une valeur qui leur est affectée. Je veux pouvoir passer le type de format en tant que paramètre dans une méthode. La déclaration ressemblera à CreateFile(4,3,2,UGS12_FMT), où UGS12_FMT est de type C++.C++: Utilisation du type de classe en tant que paramètre

Notez que je ne passe pas dans une instance en tant que paramètre. Des suggestions sur la façon d'accomplir cela?

Répondre

0

Il peut y avoir plusieurs méthodes pour cela. La première méthode, la plus recommandée, consiste à hériter de la classe d'une classe parente commune, puisqu'ils partagent "name" et "value", comme décrit précédemment.

Si vous avez vraiment besoin de savoir quelle classe il est en fonction « CreateFile », vous feriez mieux de changer l'outil de la fonction, en utilisant de multiples fonctions, comme

CreateFile(ClassA a) 
CreateFile(ClassB a) 

au lieu de

CreateFile(Class x) 
    if x is an instance of ClassA 
     doSomething ... 
    else if x is an instance of ClassB 
     doSomething ... 
0

Vous voulez regarder ce qu'est RTTI. Le support varie en fonction du compilateur, mais la fonctionnalité de base est là. Un bon endroit pour commencer here.

Notez que, par exemple pour GCC, vous aurez besoin de fonctions auxiliaires pour démêler les noms donnés par les objets type_info.

EDIT: bien sûr, assurez-vous que les modèles ne peuvent pas offrir ce que vous voulez en premier, ce serait la manière préférée.

+2

Je ne vois pas comment RTTI s'adapte ici. – jweyrich

+0

* Si * vous ne pouvez pas utiliser les modèles et que vous devez faire quelque chose qui dépend finalement d'un type, vous pouvez utiliser les informations RTTI (généralement dans une carte de type_info pour fonctionner) pour effectuer des actions conditionnellement. Cela évite la nécessité d'écrire une énumération éventuellement longue et pas si facile à maintenir. –

+0

Nous ne savons pas combien de types de fichiers OP considère, mais s'il doit écrire du code pour gérer chacun de ces types, le maintien d'un 'enum' avec un' struct' est la tâche la plus simple.De plus, 'std :: type_info :: name()' n'est pas cohérent entre les compilateurs, donc, si la portabilité est considérée, je vois cela comme la con principale. – jweyrich

1

Vous ne pouvez pas passer dans un typename comme argument de la fonction normale, à savoir votre extrait

using UGS12_FMT = some_type; 
auto file = CreateFile(4,3,2,UGS12_FMT); // error 

ne marchera jamais (sauf si vous faites CreateFile une macro qui est strongly discouraged). Au lieu de cela, vous pouvez utiliser essentiellement l'une des trois techniques alternatives suivantes.

  1. surcharge la fonction de prendre différents arguments de type vide (tag-dispatching soi-disant):

    // declarations of tag types 
    struct format1 {} fmt1; 
    struct format2 {} fmt2; // etc 
    // overloaded file creation functions 
    file_type CreateFile(args, format1); 
    file_type CreateFile(args, format2); 
    // usage: 
    auto file = CreateFile(4,3,2,fmt1); // use format1 
    
  2. Utilisez un template (et spécialisé pour différents types de format)

    template<typename Format> 
    file_type CreateFile(args); // generic template, not implemented 
    template<> file_type CreateFile<Format1>(args); // one speciliasation 
    template<> file_type CreateFile<Format2>(args); // another speciliasation 
    
    auto file = CreateFile<Format1>(4,3,2); // usage 
    
    Transmettez les informations en utilisant un type enum.
  3. enum struct format { 
        f1,    // indicates Format1 
        f2 };    // indicates Format2 
    file_type CreateFile(args,format); 
    
    auto file = CreateFile(4,3,2,format::f1); 
    

Enfin, vous pouvez combiner ces différentes approches en utilisant les classes traits comme des techniques similaires.

Questions connexes