2010-10-22 8 views
1

Mon projet a une bibliothèque héritée qui considère le pointeur NULL comme une chaîne vide.Peut faire STL chaîne :: c_str() retourne NULL quand il n'a pas de chaîne?

Mais quand je me renvoyer des données de std :: wstring comme celui-ci,

std::wstring strData; 
const wchar* pStr = strData.c_str(); 
ASSERT(NULL == pStr); // ASSERT!! 

pStr n'est pas NULL mais pointeur quel point wstring.

Est-ce que je peux faire que std :: string retourne NULL quand il n'a aucune donnée de chaîne? Maintenant, je rechauffera chaque variable membre str comme ceci:

const wchar* GetName() { // I hate this kinds of wrapping function 
    if (m_Name.empty()) 
    { 
     return NULL; 
    } 
    return m_Name.c_str(); 
} 

Mon environnement de travail est Visual Studio 2008 sp1 dans Windows

Merci à l'avance.

Répondre

1

Depuis il vous suffit que de nouveaux comportements pour interagir avec cette bibliothèque héritée et pas dans tout le code (par exemple strlen() briserai si vous passez un pointeur NULL dans ce) votre meilleur pari est d'utiliser une fonction d'utilité pour fournir un comportement approprié.

Quelque chose comme vous avez suggéré:

const wchar* GetStringBody(const std::string& str) 
{ 
    if(str.empty()) { 
     return 0; 
    } 
    return str.c_str(); 
} 

et appelez-si nécessaire.

0
template <typename Char_t, typename Traits_t, typename Allocator_t> 
inline const Char_t* StrPtr(const std::basic_string<Char_t, Traits_t, Allocator_t>& aString) { 
    return (aString.empty() || !aString.front()) ? nullptr : aString.c_str(); 
} 

template <typename Char_t> 
inline const Char_t* StrPtr(const Char_t* aString) { 
    return (!aString || !*aString) ? nullptr : aString; 
} 

Utilisez ces fonctions générales pour convertir des chaînes en pointeurs. Toutes les chaînes NULL ou empty()/"" renvoient nullptr tandis que toutes les chaînes de longueur 1+ renvoient le bon pointeur.