我正在尝试编写一个可以处理char和amp; wchar_t使用C ++ 0x的type_traits功能。是的,我知道如何在没有type_traits的情况下做到这一点,但我想使用type_traits来更好地理解该功能。
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__));
}
是否有任何type_traits属性可以区分char和wchar_t?
答案 0 :(得分:7)
我认为有一个is_same
属性,所以
SplitIt(base, ext, fullFilePath, is_same<T, char>());
应该有用。
答案 1 :(得分:1)
AFAICS,<type_traits>
标题中没有类似内容。但是,自己制作它是微不足道的,你只需要切换重载,因为以下现在为std::false_type
(以及其他所有内容)和char
std::true_type
产生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>());