【发布时间】:2022-01-21 19:58:21
【问题描述】:
我目前的设计有问题。
我有一个可以用任何 1 个参数构造的类。如果它在概念上有所帮助,请将 T 视为 lambda。
// 1
template<class T>
foo(T) {/*...*/}
这个类重载了很多操作符,比如!=
// 2
template<class T>
bool foo::operator!=(const T&) {/*...*/}
运算符独立于左右顺序,所以我在全局范围内定义了这个:
// 3
template<class T>
bool operator!=(T const& lhs, const foo& rhs) {return rhs != lhs;}
因此,我收到了很多模棱两可的operator!= 电话。这是因为它尝试使用3,将第二个参数转换为foo,因为它隐式接受所有参数,然后交换参数的顺序并调用成员函数。我以为通过向3 const& 提出论点可以避免这种情况,但我错了。
我想出了几个选项,但我对其中任何一个都不满意。
- 使构造函数显式化(这会破坏 40% 的语法糖,即此类的目标)
- 删除全局运算符
- 将全局操作符放入命名空间,然后在需要的时候做
using namespace
我还有哪些其他选择?
【问题讨论】:
-
如果
<<让你感到困惑,想象一下它会如何让任何使用你的代码的人感到困惑 -
用明确的函数名替换操作符
-
@AlexeyLarionov 它既不会让我感到困惑,也不会让实现本身感到困惑。此外,我是唯一使用该代码的人。
-
@PepijnKramer 这是一个很好的选择。不幸的是,该类是一个语法糖类,仅此而已。添加显式函数实际上违背了类的目的。此外,
operator+和operator!=等其他人也会发生这种情况。 -
我已将帖子编辑为关于
!=,因为这样可能更有意义。
标签: c++ c++17 operator-overloading