专门化模板is_string

时间:2013-08-18 23:32:26

标签: c++ c++11

我有一个类,它为不同类型的许多成员重载如下:

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等..

1 个答案:

答案 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模板参数变量以获得额外的灵活性。)