C++ 如何编写尽可能薄的类型包装器

C++ 如何编写尽可能薄的类型包装器,c++,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("OMGO

我有以下代码:

#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;
}

如果您希望
包装器
与底层类型进行相等比较,请给它一个

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;
}
模板
结构包装器{
康斯特;
包装器(const T&_in):in(_in){
运算符const T&()const{return in;}
//与基础类型进行比较
bool运算符==(T const&cmp)const{return cmp==in;}
//比较这种类型的
bool运算符==(包装常量&cmp)常量{return cmp.in==in;}
};
int main(){
包装价值(“OMGOMG”);
如果(值==标准::字符串(“ads”))
返回1;
}

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

有什么捷径可以做到这一点——比如从某个std类继承或者使用某些特性?假设我想要所有的操作员。。。为什么我的代码适用于
int
而不是
std::string
?您可以尝试继承,我会避免它。我认为,给
包装器
提供所需的运算符的意图更明确,但这可能是个人的偏好。关于为什么它不能与类一起工作,您提供了两个从
包装器
到基础
t
的转换序列,构造函数和转换运算符-编译器应该选择哪一个?关于它为什么使用<代码> int <代码>,它是一个原始类型——我没有一个C++标准引用。您可以标记它
explicit
,但转换运算符仍然不会被使用。最后一件事是,即使我将运算符作为包装器的成员提供,那么
type==wrapper
将不起作用-我想我应该将运算符作为带有2个参数的模板函数提供?编辑:刚刚尝试过-不起作用…int是一个基本类型,因此它起作用如果您需要用户定义类型的任何运算符/操作,那么,您需要定义它们侧注:您是否意识到
包装值(“omgomg”)会给您留下一个无效值吗?它将构造一个临时的
const std::string
实例,您存储它的引用,但该对象将在构造函数调用结束时消失。@grek40该死的,您是对的-我应该复制一个。。。
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;
}