2

我有一个功能,用于对与自定义​​比较器一起使用的字符串进行不区分大小写的std::lexicographical_compare比较。

但是,我希望能够相互比较stringsstring_views以及const char*相互比较,以获得最大的便利和效率。

所以我在想:如果我做一个模板,std::stringbegin/ endstd::string_viewbegin/ end,......但const char*没有,甚至不是非成员函数的形式。

所以可以像这样定义自己的begin/end重载

namespace std {
    const char * begin(const char* str) { return str; }
    const char * end(const char* str) { return str + strlen(str); }
}

这样我就可以将所有内容与所有内容进行比较

std::lexicographical_compare(std::begin(a), std::end(a), std::begin(b), std::end(b), icomp );

?

如果没有,我还能如何解决我的问题?

4

1 回答 1

9

不,这是不合法的,因为const char *它不是用户定义的类型。

std如果 C++ 程序将声明或定义添加到命名空间或命名空间内的命名空间,则 C++ 程序的行为是未定义的,std 除非另有说明。std只有当声明依赖于用户定义的类型并且特化满足原始模板的标准库要求并且没有明确禁止时,程序才能将任何标准库模板的模板特化添加到命名空间

[namespace.std/1]

您可以改为在其他命名空间中声明它们,例如::

const char * begin(const char* str) { return str; }
const char * end(const char* str) { return str + strlen(str); }

并将它们与不合格的电话一起使用

std::lexicographical_compare(begin(a), end(a), begin(b), end(b), icomp );

此外,在 C++20 中,它会更加严格,只允许程序定义类型的类模板特化

除非另有说明,否则如果 C++ 程序向命名空间std或命名空间内的命名空间添加声明或定义,则其行为未定义std

除非明确禁止,否则程序可以将任何标准库类模板的模板特化添加到命名空间 std,前提是 (a) 添加的声明依赖于至少一种程序定义的类型,并且 (b) 特化满足原始标准库的要求模板。

[namespace.std]

于 2018-10-26T15:53:12.720 回答