我创建了一个类字符串,它是同时使用char*
和wchar_t
的模板。
我想针对每种情况编译obj == " word"
,而反之而又不使operator==
过载。
我已经尝试使用运算符转换,但是它不起作用。
template<typename T>
class String
{
friend bool operator==<T>(const String<T>& a, const String<T>& b);
public:
typedef T Type_value;
String(const Type_value* str = "");
String(const String& str);
String& operator=(const String& original);
operator T* ();
operator std::string ();
~String();
private:
size_t m_size;
Buffer<Type_value> m_buff;
};
template <typename T>
bool operator== (const String<T>& a, const String<T>& b )
{
return UtilString<T>::Compare(a.m_buff, b.m_buff) == 0;
}
template<typename T>
String<T>::operator T* ()
{
return reinterpret_cast<T*>(m_buff.Begin());
}
template<typename T>
String<T>::operator std::string ()
{
return string(m_buff.Begin());
}
我希望"hello" == String<char>("hello")
有效。
答案 0 :(得分:0)
问题与
template <typename T>
bool operator== (const String<T>& a, const String<T>& b )
是T
的推论,对于"hello" == String<char>("hello")
,"hello"
与const String<T>&
不匹配,因此过载被丢弃。
您可以做的是使其成为非模板:
template <typename T>
class String
{
// non template function.
friend bool operator==(const String& lhs, const String& rhs)
{
return UtilString<T>::Compare(a.m_buff, b.m_buff) == 0;
}
// ...
};
所以"hello" == String<char>("hello")
会考虑过载(由于rhs)
operator==(const String<char>& lhs, const String<char>& rhs)
,并将在可行的情况下从String<char>
构建"hello"
。