【问题标题】:How do I force C++ to use the operator `<` defined by the compiler library?如何强制 C++ 使用编译器库定义的运算符 `<`?
【发布时间】:2021-02-22 14:20:51
【问题描述】:

我正在尝试比较字符串,其中字符串仅由数值组成。

我将自己的operator &lt; 定义为

bool operator<(const string &s1, const string &s2)
{
    if(s1.size() != s2.size()) return s1.size() < s2.size();
    return s1 < s2; // I don't want this to use mine
}

在最后一个 return 语句中,我希望 &lt; 曾经是 C++ 库定义的那个。如何强制程序执行此操作?

【问题讨论】:

  • 不要为std::stringoperator &lt;。相反,请创建自己的命名函数/仿函数并使用它。
  • 我不确定这个运算符是否能满足您的要求,即使您解决了重载问题(例如,将“0001”与“10”进行比较)。
  • 更好的是,如果您正在处理一种受约束的字符串(所有字符都是数字),那么它不是是一个简单的std::string。编写一个包装字符串的类,并检查 c'tor 中的约束。那么operator&lt; 不会与任何东西冲突,因为它已经接受了MyString 参数。

标签: c++ string comparison string-comparison


【解决方案1】:

虽然我不建议为标准库类重载operator&lt;,但您可以通过显式调用标准库实现来实现您的要求,例如:

bool operator<(const std::string& s1, const std::string& s2)
{
    if (s1.size() != s2.size()) {
        return s1.size() < s2.size();
    }
    return std::operator<(s1, s2);
}

更新:正如 cmets 中所指出的,std::operator&lt;(s1, s2) 在 C++20 中不起作用。我想使用std::less()(s1, s2) 会解决问题,但是它的外观以及它工作的原因(不同的命名空间)都表明这不是要走的路,创建一个自定义类是一个更好的解决方案你的问题。

【讨论】:

  • 这在 C++20 中不起作用,因为这个操作符被移除了(有利于宇宙飞船操作符)
  • std::operator&lt;(s1, s2) 使用comparestd::less 会使用&lt;(所以可能是无限循环)...在C++20 中std::operator&lt;=&gt;(s1, s2) &lt; 0;,或者直接使用比较方法。
  • 没有无限循环,因为我们的自定义比较运算符对std::less 不可见。丑陋,但有效。
【解决方案2】:

其他人已经直接回答了这个问题。我宁愿建议你不要这样做;)。正如评论中提到的:最好不要为std::stringoperator&lt;。它不是你的类型。

如果你想做,你有不同的选择:

std::string a,b;
bool b = a < b;

使用您的自定义比较。不比较像std::string 的字符串不是std::strings,所以有一个包装器是很自然的。要么让包装器拥有字符串,要么让它保留一个引用:

struct my_string {
     const std::string& data;
     bool operator<(const my_string& other) {
         return ...;
     }
};

这样你就可以写了:

std::string a,b;
bool b = my_string{a} < my_string{b};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-25
    • 2010-10-18
    • 1970-01-01
    • 2014-10-25
    • 2012-03-29
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多