如何编写最薄的包装器

时间:2017-01-24 08:26:29

标签: c++

我有以下代码:

#include <string>

template<typename T>
struct Wrapper {
    const T& in;
    Wrapper(const T& _in) : in(_in) {}

    operator const T&() const { return in; }
};

int main() {
    Wrapper<std::string> value("OMGOMGOMG");
    if(value == std::string("ads"))
        return 1;
}

我收到一条错误,指出operator==与gcc / msvc不匹配 - 如何让这段代码生效?

对于int类型,它可以正常工作,但std::string却没有。

修改

我最后自己写了 - 作为带有2个参数的单独模板:

template<typename T> bool operator==(const WithContext<T>& lhs, const T& rhs){ return lhs.in == rhs; }
template<typename T> bool operator==(const T& lhs, const WithContext<T>& rhs){ return lhs == rhs.in; }
template<typename T> bool operator!=(const WithContext<T>& lhs, const T& rhs){ return lhs.in != rhs; }
template<typename T> bool operator!=(const T& lhs, const WithContext<T>& rhs){ return lhs != rhs.in; }
template<typename T> bool operator< (const WithContext<T>& lhs, const T& rhs){ return lhs.in <  rhs; }
template<typename T> bool operator< (const T& lhs, const WithContext<T>& rhs){ return lhs <  rhs.in; }
template<typename T> bool operator> (const WithContext<T>& lhs, const T& rhs){ return lhs.in >  rhs; }
template<typename T> bool operator> (const T& lhs, const WithContext<T>& rhs){ return lhs >  rhs.in; }
template<typename T> bool operator<=(const WithContext<T>& lhs, const T& rhs){ return lhs.in <= rhs; }
template<typename T> bool operator<=(const T& lhs, const WithContext<T>& rhs){ return lhs <= rhs.in; }
template<typename T> bool operator>=(const WithContext<T>& lhs, const T& rhs){ return lhs.in >= rhs; }
template<typename T> bool operator>=(const T& lhs, const WithContext<T>& rhs){ return lhs >= rhs.in; }

1 个答案:

答案 0 :(得分:4)

如果您希望Wrapper与基础类型进行相等比较,请给它一个。

template<typename T>
struct Wrapper {
    const T& in;
    Wrapper(const T& _in) : in(_in) {}

    operator const T&() const { return in; }

    // compare to the underlying type
    bool operator==(T const& cmp) const { return cmp == in; }
    // compare the this type
    bool operator==(Wrapper const& cmp) const { return cmp.in == in; }
};

int main() {
    Wrapper<std::string> value("OMGOMGOMG");
    if(value == std::string("ads"))
        return 1;
}

此处提供的示例代码仅用于说明,以支持应实现所需比较功能的前提。实际上,比较函数可能会成为非成员函数以支持更自然的语法。