2013-08-18 73 views
2

我有重載很多成員對不同類型的如下一類:專營模板IS_STRING

template<typename T, typename Allocator> 
Stream& operator << (Stream &Destination, const std::list<T, Allocator> &Value) 

template<typename T, typename Allocator> 
Stream& operator << (Stream &Destination, const std::vector<T, Allocator> &Value) 

而現在我想專注它串..我的是字符串中使用創建:

template<typename T> 
struct is_string : public std::integral_constant<bool, std::is_same<char*, typename std::decay<T>::type>::value || std::is_same<const char*, typename std::decay<T>::type>::value> {}; 

template<> 
struct is_string<std::string> : std::true_type {}; 

,然後我希望把它的專業如下:

template<typename T = typename is_string<T>::value_type> //How? 
Stream& operator << (Stream &Destination, const typename is_string<T>::value_type &Value) 
{ 
    std::cout<<"HERE"; 
    return Destination; 
} 

//I can do: 
template<typename T = std::string> //works fine. 
Stream& operator << (Stream &Destination, const typename is_literal<T>::value_type &Value) 
{ 
    std::cout<<"HERE"; 
    return Destination; 
} 

我怎樣才能解決串o ne,以便它適用於所有字符串類型,以便T是任何字符串類型傳遞的?

編輯:我想這樣做,這樣是專門爲所有字符串類型:字符*,爲const char *的char [],爲const char [],的std :: string等。

+0

爲什麼檢查,如果類型爲字符串,而不是直接的專業運營商''<<對'的std :: string','字符常量*'...? –

+0

因爲我必須專門處理每種可能類型的字符串? std :: string,const char *,char *,char [],const char []等等。?我認爲如果有辦法做我想做的事情,它會自動專門爲這種類型。 – Brandon

+0

我確定我錯過了一些東西,你爲'Stream&operator <<()'覆蓋了其他類型,爲什麼不是'const std :: string&'呢?誠然,我沒有嘗試過,但它*似乎*它會做你想做的(我認爲)? – WhozCraig

回答

3

我會使用這樣的:

#include <type_traits> 
#include <ostream> 

template <typename T> 
typename std::enable_if<is_string<T>::value, std::ostream &>::type 
operator<<(std::ostream & o, T const & x) 
{ 
    return o << x; // or whatever 
} 

這使得過載只有T滿足特質。

(你也可以讓所有的ostream的模板參數變量更多的靈活性。)