2011-07-07 36 views
6

Estoy tratando de escribir una función que pueda manejar tanto char & wchar_t usando la característica type_traits de C++ 0x. Sí, sé cómo hacerlo sin type_traits, pero quiero hacerlo usando type_traits para una mejor comprensión de la característica.¿Es posible usar type_traits para diferenciar entre char & wchar_t?

template <typename T> 
void SplitIt(T* base, T* ext, const std::basic_string<T>& fullFilePath, std::true_type) 
{ 
    _splitpath(fullFilePath.c_str(),NULL,NULL,base,ext); 
} 

template <typename T> 
void SplitIt(T* base, T* ext, const std::basic_string<T>& fullFilePath, std::false_type) 
{ 
    _wsplitpath(fullFilePath.c_str(),NULL,NULL,base,ext); 
} 

template <typename T> 
std::basic_string<T> GetBaseName(const std::basic_string<T>& fullFilePath) 
{ 
    T base[300], ext[50]; 

    SplitIt(base, ext, fullFilePath, /*What goes here?*/); 

    return std::basic_string<T>(buf) + ext; 
} 


int main() 
{ 
    std::basic_string<TCHAR> baseName = GetBaseName(std::basic_string<TCHAR>(__FILE__)); 
} 

¿Hay alguna propiedad type_traits que diferencie a char de wchar_t?

Respuesta

7

Creo que hay una propiedad is_same, por lo

SplitIt(base, ext, fullFilePath, is_same<T, char>()); 

debería funcionar.

+0

Pff, soluciones fáciles! ... Estoy avergonzado de no pensar en eso ... :( – Xeo

+0

Brillante! Aunque debería ser is_same en mi código. Gracias. – Sharath

+0

@Sharat: Correcto, lo arreglé ... – MartinStettner

1

AFAICS, no hay nada como eso en el encabezado <type_traits>. Sin embargo, es trivial para hacerlo usted mismo, sólo es necesario cambiar la sobrecarga ya la siguiente ya produce std::false_type para char (y todo lo demás) y std::true_type para wchar_t:

#include <type_traits> 

template<class T> 
struct is_wchar 
    : std::false_type 
{ 
}; 

template<> 
struct is_wchar<wchar_t> 
    : std::true_type 
{ 
}; 

// usage: 

SplitIt(base, ext, fullFilePath, is_wchar<T>()); 
+0

Existe la propiedad 'is_same' en el encabezado' ', que implementa exactamente este comportamiento ... – MartinStettner

+0

Gracias, esto tampoco está mal. – Sharath

Cuestiones relacionadas