在C ++中写两个基本类型之间的重载比较(==)

时间:2014-08-19 21:44:10

标签: c++ casting operator-overloading

正如article指出的那样,不可能重载比较运算符(==),这样双方都可以采用原始类型。

  

"不,C ++语言要求您的运算符重载至少取一个"类类型的操作数"或枚举类型。 C ++语言不允许您定义所有操作数/参数都是基本类型的运算符。" (parashift

我在想:

**如果我真的需要使用==以非标准方式比较两个基元,有没有办法将它们隐式地转换为其他类?

例如,以下代码适用于const char*比较,但需要显式转换。如果可能的话,我宁愿避免使用明确的演员表。

// With an explicit cast
if(string("a")=="A") // True

// Without the cast
if("a"=="A") // False

// An example overloaded function:
bool operator == (string a, const char* b)
{
    // Compares ignoring case
}

在某些情况下,施放可能非常笨重,特别是如果你需要在长表达式中进行多次转换。这就是为什么我正在寻找一种方法来自动将第一个输入(或两者)转换为刺痛类型。


编辑1:

另一种方法是编写一个isEqual(const char* a, const char* b)函数,但是我想避免这种情况,因为如果我在一个大的if语句中使用它会导致一个圆括号。这是一个过于简单的例子,仍然显示了我的意思:

if (str1 == str2 || str1 == str3 || str2==str4)

相反:

if (isEqual(str1,str2) || isEqual(str1,str3) || isEqual(str2,str4))


编辑2:

我知道有很多方法可以实现所需的功能而不会重载==。但我特意寻找一种使==工作的方法,因为我可以将这些知识应用于其他运营商。

这个问题实际上与我几周前提到的Wacky Math Calculator问题密切相关,并且能够超载==将有助于使代码看起来更好(视觉上,但可能不在& #34; clean code"方式)。

我想在这里问这个问题,以防有人有一个很酷的C ++技巧,我不知道。但如果答案是“否”,那也很好。

3 个答案:

答案 0 :(得分:2)

您当然可以编写一个或多个免费函数来进行比较。它不一定是操作员过载。

例如:

bool IsEqual(const char* a, const string& b)
{
  // code
}

bool IsEqual(const string& a, const char* b)
{
  // code
}

等等。

答案 1 :(得分:1)

如果给出了操作数的类型,并且您不能为相等添加重载,因为

  • 它根本不可重载,因为它们都是原始类型
  • 已经出现了超载,无法满足您的需求
  • 你不想冒着违反ODR的风险,因为其他人可能会拉你做同样的特技(在这种情况下,TU本地覆盖可能会起作用,也就是说自由文件本地。请注意不利影响模板。)

只有两个选项:

  • 使用包装器并将所有操作符重载到您的内容中。
  • 明确使用具有所需行为的函数,只需忘记syntax-sugar。
BTW:标准库容器和算法通常可以通过三种方式进行定制:

  • 使用具有重载运算符的类型
  • 使用标准traits-class special
  • 提供不同的特质课程。

答案 2 :(得分:0)

不,没有办法以你想要的方式隐式地转换基元类型。

实现所需功能的唯一方法是通过显式地将输入转换为问题中所述的另一个类,或者通过创建@Logicat所示的自由函数。