【问题标题】:==operator overload only on certain occasions==运算符重载仅在某些情况下
【发布时间】:2015-01-28 23:46:14
【问题描述】:

我正在制作一个将类型作为模板的项目。如您所知,operator== 已经为字符、整数、字符串等重载,但是如果用户决定传入一个 cstring(以空字符结尾的字符数组),我将需要为此重载 ==。我可以选择仅在用户使用 cstrings 时重载 operator==,而在他们不使用时使用默认 == 吗?这将如何实现?

【问题讨论】:

  • 请向我们展示您的代码。
  • 你的意思是重载还是模板特化?
  • 代码很长,无论如何这是一个普遍的问题。我不觉得这会有所帮助。 Greatwolf,我的意思是超载。
  • 也许可以使用 C++11 的 'enable_if' 来做到这一点。
  • “代码很长,无论如何这是一个普遍的问题。我不认为它会有所帮助。” - 最好创建最少的代码来说明您在此处发布的特定问题,即使它不是您的项目代码的提炼。我发现您的问题非常不清楚且措辞模棱两可(例如,不清楚“cstring”是否是一个管理空终止字符数组的类,或者您试图简洁地描述后者,并且“将类型作为模板”的措辞非常奇怪)。

标签: c++ syntax operator-overloading


【解决方案1】:

您不能为 C 字符串重载 operator==,因为它们是指针,并且如果至少一个操作数是类或枚举,则可以重载运算符。你可以做的是创建你自己的比较器函数并在你的代码中使用它而不是==

template<typename T>
bool my_equal(const T& a, const T& b) {
    return a == b;
}

bool my_equal(const char* a, const char* b) {
    return /* your comparison implementation */;
}

更新:您可能需要添加更多重载以支持 std::stringconst char* 比较,正如 TonyD 在 cmets 中指出的那样。

【讨论】:

  • 合理的方法,尽管对于 John 的 “我还需要它来比较 cstrings 和 std::string。” 你需要更多的重载......干杯。
  • 很棒的解决方案,不知道为什么我没有想到这个!
  • 第二个“my_equal”解决方案适用于字符串和 cstring 比较。效果很好。
  • @JohnCalderaio:“第二个“my_equal”解决方案适用于字符串和 cstring 的比较。” - 不适合另一个 - proof here,但如果你不需要,一切都好。干杯。
【解决方案2】:

您可以使用类型特征来分派到正确的函数。例如:

#include <type_traits>

template<typename T>
using is_cstring =
    std::integral_constant<bool,
        std::is_same<T, char const*>::value
     || std::is_same<T, char*>::value>;

template<typename T>
class Thingy
{
public:
    bool operator==(Thingy const& rhs) const
    {
        return equal_helper(rhs, is_cstring<T>());
    }
private:
    bool equal_helper(Thingy const& rhs, std::true_type) const
    {
        return strcmp(m_value, rhs.m_value) == 0;
    }

    bool equal_helper(Thingy const& rhs, std::false_type) const
    {
        return m_value == rhs.m_value;
    }

    T m_value;
};

【讨论】:

  • 谢谢!你们帮了大忙!
【解决方案3】:

您不能在 C 字符串上重载 == 运算符。我不完全确定为什么需要这样做 - C++ string 类已经定义了从 C 字符串进行的隐式转换,并且已经定义了 == 运算符。

【讨论】:

  • operator== 当应用于 cstrings 时比较指针是否相等,而不是 cstring 的内容。这是一个巨大的差异——更不用说,为什么它不能(安全地)用于比较地图中的键。我还需要它将 cstrings 与 std::string 进行比较。内容,一个字符一个字符,而不是指针。
  • 那么,另一个答案要令人满意得多。
  • @JohnCalderaio “更不用说,为什么它不能(安全地)用于比较地图中的键。” - 如果您指定自定义比较,它可以是,但你几乎总是最好将键设置为std::strings,否则如果有人插入一个指向字符串文字的指针,它不应该是deleted,而任何指向基于堆栈的自动变量的指针都需要有它们的内容复制到堆栈并稍后删除。 std::string 适用于所有这些情况。 “我还需要它来将 cstrings 与 std::string 进行比较。” - 再次,使用 std::string 会解决这个问题....
猜你喜欢
  • 2017-09-09
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2015-05-02
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
相关资源
最近更新 更多