重新定义要在字符串的 STL 算法中使用的<运算符



是否有可能在不修改std名称空间的情况下重新定义operator <,以使该操作员在标准算法中使用?例如,我可以写:

namespace std
{
    bool operator <(const std::string & rhs, const std::string & lhs)
    {
        std::cout << "lol";
        return false;
    }
}
int main()
{
    std::vector<std::string> lol = { "a", "b", "ba", "aa" };
    std::sort(lol.begin(), lol.end());
}

和" LOL"将被打印好几次。但是,如果我将operator <从STD名称空间外移出,则将使用默认的operator <,并且不会打印任何内容。是否可以使用自定义operator <制作std::sort,而无需将其包含在STD名称空间中?

是的,我知道,我可以将另一个比较器传递给std :: sort,但是如果我能做我问的事情以及如何做,这对我来说很有趣?

我还正确吗,在std名称空间中添加此类模板专业化是正确的吗?

更新:这不是实际的问题,我只想知道如果可能的话,我该怎么做。

不,不是。在标准名称空间中添加功能是未定义的行为。[namespace.std]/1状态:

,如果C 程序的行为将其添加到命名空间std或命名空间std中的名称空间中的声明或定义,除非另有说明。只有在声明取决于用户定义的类型并且专业化符合原始模板的标准库要求并且未明确禁止时,只有在声明取决于用户定义的类型时,程序才能为任何标准库模板添加模板专业化。

如果您想更改std::sort的方式,则可以提供lambda并定义您想要的

std::sort(std::begin(foo), std::end(foo), [](const auto& lhs, const auto& rhs) { /* your code here */ });

可以重新定义操作员&lt;对于没有修改性std名称空间的字符串

当然,您可以在另一个命名空间中定义过载。但是,正如您发现的那样,除非有明确的资格,否则不会通过超载分辨率找到它。

可以使用自定义操作员&lt;不包含它到STD名称空间吗?

是的,您似乎已经知道如何:

是的,我知道,我可以将另一个比较器传递给std :: sort

这正是比较器参数的目的。

我还正确地,在std名称空间中添加这样的模板专业化是有核心的吗?

这不是模板专业化;这是一个函数定义,您不得将功能定义添加到std名称空间中 - 否则行为是未定义的。您将被允许添加模板专业,但是只有至少一种类型参数是用户定义的类型。

最新更新