4

我有一个类为不同类型重载了很多成员,如下所示:

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)

现在我正在尝试将它专门用于字符串..我使用以下方法创建了一个 is 字符串:

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

4

1 回答 1

4

我会使用这样的东西:

#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 模板参数设置为可变以增加灵活性。)

于 2013-08-18T23:48:52.540 回答