Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以指定不同的C++`operator=`功能取决于呼叫站点的上下文?_C++_Operator Overloading_C++17 - Fatal编程技术网

C++ 是否可以指定不同的C++`operator=`功能取决于呼叫站点的上下文?

C++ 是否可以指定不同的C++`operator=`功能取决于呼叫站点的上下文?,c++,operator-overloading,c++17,C++,Operator Overloading,C++17,我试图为我的自定义类显式地进行浮点相等比较(精确比较与近似比较)。我可以避免重载=操作符,并强制用户调用类似完全相等或几乎相等之类的函数,但这不适用于现成的std算法。我想知道是否有一种很好的方法可以通过强制在呼叫站点进行显式的操作员查找(有点像std::rel_ops)来实现两全其美 例如,假设我有这个CustomType类和一些操作符==重载: struct CustomType{ 双重价值; }; 名称空间完全相等{ 自动运算符==(自定义类型常量和lhs,自定义类型常量和rhs)->bo

我试图为我的自定义类显式地进行浮点相等比较(精确比较与近似比较)。我可以避免重载
=
操作符,并强制用户调用类似
完全相等
几乎相等
之类的函数,但这不适用于现成的
std
算法。我想知道是否有一种很好的方法可以通过强制在呼叫站点进行显式的操作员查找(有点像
std::rel_ops
)来实现两全其美

例如,假设我有这个
CustomType
类和一些
操作符==
重载:

struct CustomType{
双重价值;
};
名称空间完全相等{
自动运算符==(自定义类型常量和lhs,自定义类型常量和rhs)->bool{
返回lhs.value==rhs.value;
}
}//名称空间完全相等
名称空间几乎相等{
自动运算符==(自定义类型常量和lhs,自定义类型常量和rhs)->bool{
return std::abs(lhs.value-rhs.value)<1e-2;//这不是“正确”的方法,只是一个示例。
}
}//名称空间几乎相等
使用该类,我可以执行以下操作,编译和运行良好:

auto main()->int{
auto const a=CustomType{1.0/3.0};
auto const b=CustomType{0.3333};
{
使用完全相等的名称空间;
如果(a==b){

std::cout您已经列举了一些看似合理、有缺陷的方法,但定义自己比较的包装器类型除外。它们可能存储指向底层对象的指针或引用以避免复制,尽管即使这样也不允许算法以不同方式解释容器或者,现代的解决方案是使用范围(可能包括在C++20中)及其可组合的转换和投影(与上一种方法非常相似).

这是一个有趣的问题,但是有一个操作符的行为会根据上下文无声地改变,这有点可怕,因为我更喜欢一个更明确和可控的界面。这是一个很好的观点,也许我们会坚持使用我们目前使用的显式函数。我很好奇,在这一点上,re中有什么东西很抱歉这么直截了当,但你必须考虑你的用户(可能在3个月内).你真的认为运算符==表示几乎相等是合乎逻辑的吗?是的,我不反对。我们正在努力找到一个平衡点。我们希望防止初级开发人员出现错误,他们还没有根深蒂固的浮点比较的细微差别,但我们也不想用一堆额外的冗长来烦扰高级开发人员。也许我们会I don’我不必做出这样或那样的选择,也不必处理后果。我仍然很好奇,如果(a=smart=b){
,使用
=smart=
中缀运算符,使用下面的技术: