C++ Obtenir le nom du type, modèle

Je suis en train d'écrire certaines classes de modèle pour parseing certains fichiers de données texte, et en tant que tel, il est likly la grande majorité des erreurs d'analyse vont être due à des erreurs dans le fichier de données, qui sont pour la plupart écrits par des programmeurs, et donc besoin d'un gentil message sur les raisons de l'application a échoué à charge par exemple quelque chose comme:

Erreur d'analyse example.txt. Valeur ("notaninteger")de [MySectiom]Clé n'est pas valide int

Je peux travailler sur le fichier, l'article et les noms de clés à partir d'arguments passés à la fonction de modèle et membre de vars dans la classe, mais je ne suis pas sûr de la façon d'obtenir le nom du type de la fonction de modèle est d'essayer de convertir de.

Mon code actuel ressemble, avec des spécialités pour de simples chaînes de caractères et tel:

template<typename T> T GetValue(const std::wstring &section, const std::wstring &key)
{
    std::map<std::wstring, std::wstring>::iterator it = map[section].find(key);
    if(it == map[section].end())
        throw ItemDoesNotExist(file, section, key)
    else
    {
        try{return boost::lexical_cast<T>(it->second);}
        //needs to get the name from T somehow
        catch(...)throw ParseError(file, section, key, it->second, TypeName(T));
    }
}

Id plutôt pas des surcharges pour chaque type que les fichiers de données peuvent utiliser, puisqu'il y a des tas d'entre eux...

Aussi j'ai besoin d'une solution qui n'engage pas de gestion d'exécution, sauf si une exception se produit, c'est à dire une compilation complète d'une solution en temps est ce que je veux puisque ce code est appelé tonnes de fois et de temps de chargement sont déjà à faire un peu long.

EDIT: Ok c'est la solution je suis venu avec:

J'ai un types.h contient les éléments suivants

#pragma once
template<typename T> const wchar_t *GetTypeName();

#define DEFINE_TYPE_NAME(type, name) \
    template<>const wchar_t *GetTypeName<type>(){return name;}

Alors je peux utiliser le DEFINE_TYPE_NAME macro au rpc fichiers pour chaque type j'ai besoin de traiter (par exemple, dans le fichier cpp qui ont défini le type de départ).

L'éditeur de liens est alors en mesure de trouver la appropirate modèle de spécialisation, tant qu'il a été défini quelque part, ou de jeter un linker error autrement de sorte que je peux ajouter le type.

  • pas vraiment pertinentes à votre question, mais vous pourriez vouloir utiliser la carte.trouver(section) lors de l'accès à la section aswell, sauf si vous souhaitez volontairement pour créer une section vide.
InformationsquelleAutor Fire Lancer | 2009-06-28