问题标签 [operator-overloading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
399 浏览

c++ - 函数重载失败:为什么这些运算符会发生冲突?

我有一个很大的代码库,其中包括两个主要的命名空间:引擎和应用程序。

引擎将vector3 类定义为另一个vector3 类的typedef,相等运算符位于引擎命名空间中,而不是vector3 类中。我向应用程序添加了一个类,该类在应用程序命名空间中也有相等运算符。

当我尝试编译时,不相关但附近的 vector3 比较失败,因为它找不到合适的相等运算符。我怀疑我引起了冲突,所以将我的相等运算符移到我添加的类中,编译成功。

但是在考虑之后,我看不出编译失败的原因。没有从 vector3s 到我的类的隐式转换,反之亦然,并且依赖于参数的查找应该从引擎命名空间中拉入相等运算符并匹配它。

我尝试在示例 C++ 项目中重现此错误,但拒绝中断。大型代码库中一定有一些东西导致了这个问题,但我不确定从哪里开始寻找。类似于流氓“使用引擎”的反面?有人有什么想法吗?

0 投票
8 回答
151576 浏览

c++ - 应该将 operator<< 实现为友元还是成员函数?

这基本上是一个问题,是否有“正确”的实施方式operator<<?读到这里,我可以看到类似:

比类似的东西更受欢迎

但我不太明白为什么要使用其中一个。

我的个人情况是:

但我可能会这样做:

我应该根据什么理由做出这个决定?

注意

其中段落是一个字符串。

0 投票
8 回答
137766 浏览

c# - 如何在 C# 中重载方括号运算符?

例如,DataGridView 允许您执行以下操作:

但在我的一生中,我找不到关于索引/方括号运算符的文档。他们怎么称呼它?它在哪里实施?能扔吗?我怎样才能在自己的课堂上做同样的事情?

ETA:感谢所有快速回答。简而言之:相关文档在“Item”属性下;重载的方法是声明一个像public object this[int x, int y]{ get{...}; set{...} }; 至少根据文档,DataGridView 的索引器不会抛出。它没有提到如果您提供无效坐标会发生什么。

ETA 再次:好的,即使文档没有提到它(顽皮的微软!),事实证明,如果您提供无效坐标,DataGridView 的索引器实际上会抛出 ArgumentOutOfRangeException。公平警告。

0 投票
4 回答
5593 浏览

c++ - 如何重载不接受或不返回 ostream 的 operator<<

原始问题

我正在编写一个日志类,目标是能够做到这一点:

目前我的 Logger 标头看起来像这样:

关于这个类的一些注意事项:

  1. 跨平台兼容性不是问题。
  2. 在 Logger.cpp 内部有一个单例类负责创建“真正的”ostream。
  3. Logger 构造函数和解构函数执行必要的单例锁定。

我有三个问题:

  • 如何使 operator<< 函数成为朋友或成员,以便我可以将 out_stream 设置为私有?
  • 如何使 operator<< 函数适用于操纵器?
  • 如何添加专业化,以便如果 T 是 WCHAR* 或 std::wstring,它将在将其传递给 out_stream 之前将其转换为 char* 或 std::string?(我可以进行转换。在我的情况下,丢失高 unicode 字符不是问题。)

答案中学到的东西总结:

  • 将模板放在朋友之前而不是之后。
  • std::ios::hex 不是操纵器。std::hex 是一个操纵器。

最终结果

0 投票
7 回答
25549 浏览

c# - 是否有在 C# 中重载赋值运算符的解决方法?

与 C++ 不同,在 C# 中,您不能重载赋值运算符。

我正在为具有非常大数字的算术运算做一个自定义 Number 类,我希望它具有内置数字类型(如 int、decimal 等)的外观。我重载了算术运算符,但是任务仍然...

这是一个例子:

有解决该问题的方法吗?

0 投票
11 回答
71633 浏览

c++ - 为什么要覆盖 operator()?

Boost Signals库中,它们重载了 () 运算符。

这是 C++ 中的约定吗?对于回调等?

我在一位同事的代码中看到了这一点(他恰好是 Boost 的忠实粉丝)。在所有 Boost 的优点中,这只会让我感到困惑。

关于这种超载的原因有什么见解吗?

0 投票
6 回答
4822 浏览

c# - 可能重载空合并运算符?

是否可以为 C# 中的类重载空合并运算符?

例如,如果实例为空,我想返回一个默认值,如果不是,则返回该实例。代码看起来像这样:

但是,如果我想使用 null-coalescing 运算符来检查 MyClass.MyValue 是否已设置,该怎么办?

0 投票
4 回答
1377 浏览

.net - 隐式运算符和 TypeConverters 是否等效?

在我看来,实现隐式运算符与 TypeConverter 相比非常容易,因此我假设它们不等效,因为 TypeConverters 在框架中很流行(请参阅任何扩展 FrameworkElement 的内容)。

但为什么?创建 string->object 和 object->string 隐式运算符并利用序列化中的那些(XML 和 XAML)不是更容易吗?

是雅格尼吗?单一责任?因为您不能在接口中指定运算符重载?

0 投票
2 回答
1877 浏览

c# - 为什么 C# 编译器不调用隐式强制转换运算符?

假设我们有以下类型:

并尝试编译以下代码片段:

这剪辑编译得很好,没有错误。i1 和 i2 转换为整数并评估加法。

但是如果我们有以下类型:

尝试编译另一个代码片段:

现在的问题是,为什么编译器会生成“错误 CS0019:运算符 '+' 不能应用于 'MyNullable<Money>' 和 'MyNullable<Money>' 类型的操作数”?

0 投票
4 回答
2607 浏览

c++ - 在 C++ 中使用 const 覆盖两个参数的运算符

我正在尝试使用两个 const 参数创建一个重写的运算符函数,但我不知道该怎么做。这是一个简单的例子:

我在这里要做的是将两个参数传递给加法函数,它们都是 const 并返回结果而不更改类中的任何内容:

这可能吗?我将如何去做?

谢谢,