如何编写“ hello” == obj而不会重载operator ==?

时间:2019-04-09 20:03:20

标签: c++ string templates operator-overloading

我创建了一个类字符串,它是同时使用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")有效。

1 个答案:

答案 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"