2011-07-07 15 views
6

Tôi đang cố gắng viết một hàm có thể xử lý cả char & wchar_t bằng cách sử dụng tính năng type_traits của C++ 0x. Có, tôi biết làm thế nào để làm điều đó mà không có type_traits, nhưng tôi muốn làm điều đó bằng cách sử dụng type_traits để hiểu rõ hơn về tính năng này.Có thể sử dụng type_traits để phân biệt giữa char & wchar_t không?

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__)); 
} 

Có thuộc tính type_traits nào khác biệt với char từ wchar_t không?

Trả lời

7

Tôi nghĩ rằng có một tài sản is_same, vì vậy

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

sẽ hoạt động.

+0

Pff, giải pháp dễ dàng! ... Tôi xấu hổ vì thậm chí không nghĩ về điều đó ... :( – Xeo

+0

Brilliant! Mặc dù nó phải là is_same trong mã của tôi.Cảm ơn – Sharath

+0

@Sharat: Đúng, cố định nó ... – MartinStettner

1

AFAICS, không có gì giống như vậy trong tiêu đề <type_traits>. Tuy nhiên, nó là tầm thường để làm cho nó chính mình, bạn chỉ cần chuyển đổi các tình trạng quá tải kể từ sau giờ mang lại std::false_type cho char (và mọi thứ khác) và std::true_type cho 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

Có thuộc tính 'is_same' trong tiêu đề' ', thực hiện chính xác hành vi này ... – MartinStettner

+0

Cảm ơn, điều này cũng không tệ. – Sharath

Các vấn đề liên quan