我有一个类,它为不同类型的许多成员重载如下:
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;
}
如何修复字符串以使其适用于所有字符串类型,以便T是传递的字符串类型?
编辑:我正在尝试这样做,以便专门针对所有字符串类型:char *,const char *,char [],const char [],std :: string等..
答案 0 :(得分: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模板参数变量以获得额外的灵活性。)