Законно ли определять std :: begin для const char *? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть функция для сравнения строк без учета регистра, которая использует std::lexicographical_compare с пользовательским компаратором.

Однако я хотел бы иметь возможность сравнивать strings, string_views и const char* между каждымдругие, для максимального удобства и эффективности.

Итак, я подумал: а что, если я сделаю шаблон, std::string имеет begin / end, std::string_view имеет begin / 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 );

?

Если нет, то как еще я могу решить мою проблему?

1 Ответ

0 голосов
/ 26 октября 2018

Нет, это недопустимо, поскольку const char * не является пользовательским типом.

Поведение программы на C ++ не определено, если она добавляет объявления или определения для пространства имен std или для пространства имен в пространстве имен 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 при условии, что (а) добавленная декларация зависит хотя бы от одного программно определенный тип и (б) специализация соответствует стандарту Требования к библиотеке для оригинального шаблона.

[namespace.std]

...