2010-06-18 7 views
2

Je crée un système d'événements. Il est basé sous boost :: signals. Pour faciliter le travail, j'utilise typedef pour les signatures de fonction. Tout est OK jusqu'à ce que j'ai besoin de créer une nouvelle méthode système de l'événement. Je dois créer le typedef dynamiquement sur un type donné à la fonction de modèle. Le problème est le nom de typedef.Création dynamique de typedef

Certains pseudocode J'ai:

template<typename EventType> 
void create(const string &signalName) 
{ 
    typedef EventType signalName; 
    // ... 
} 

Est-il possible de faire une telle typedef (leur nom) avec une chaîne passée ou données ou autre chose? Je ne veux pas que l'utilisateur s'en soucie.


UPD: Alors, j'ai une liste typedefs des signatures de fonction - événements. J'ai une fonction de template pour connecter des slots, par exemple. Je ne veux pas forcer l'utilisateur à entrer à chaque fois la signature par ses mains (l'utilisateur est le programmeur qui utilisera le système d'événements). Donc j'utilise simplement mon typedefs de l'espace de noms spécial dans l'argument du template.

+3

Supposons une telle chose était possible. Comment envisagez-vous * d'utiliser * ce typedef une fois que vous l'avez créé? Raconter votre utilisation prévue pourrait aider les gens à penser à des solutions alternatives. –

+0

@ rob-kennedy mis à jour – Ockonal

+1

Merci, mais cela n'a pas vraiment répondu à ma question. Je voulais dire que vous devriez montrer comment vous appelez cette fonction 'create', et ensuite montrer comment utiliser le typedef qui en résulte. Montrez un exemple de code pour savoir comment utiliser une telle fonctionnalité. –

Répondre

4

typedefs seul importe lors de la compilation. Pour autant que je sache, c'est juste un alias pour un type.

+0

Ouais et j'ai besoin de ces alias à l'avenir, après ma fonction va faire le travail. – Ockonal

3

Les paramètres de modèle sont, par définition, des entités de temps de compilation. Vous ne pouvez pas créer dynamiquement des classes de modèles à la volée pendant l'exécution du programme, autant que je sache.

+0

Vous avez complètement raison. –

1

Dans ce cas, je ne voudrais pas aller pour typedef. Si vous voulez avoir plusieurs types d'événements et les créer dynamiquement, vous pouvez utiliser une classe simple contenant les informations sur le type d'événement. Lorsque vous avez un événement, vous le liez au type d'événement créé précédemment.

Quelque chose comme ceci:

class EventType 
{ 
    private: 
    string type; 

    EventType(string type); 
}; 

class Event 
{ 
    private: 
    string event_name; 
    EventType *event_type; 

    Event(string event_name, EventType event_type); 
}; 

... 

void create(const string &signalName) 
{ 
    EventType *event_type = new EventType("type_x"); 
    Event *event = new Event("event_x", event_type); 
}