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