Extended name lookup for methods

alex-ganyukhin
alex-ganyukhin

Сама идея не нова, это уже есть в некоторых других языках программирования, например, C#.

В мире C++ на текущий момент времени, если есть необходимость добавить какой-либо функционал в класс, но нет доступа к исходникам, приходится использовать обычные функции, что логически не позволяет разделить функции на "функции, расширящие функционал типа" и "функции, использующие объект данного типа".
Например, std::string:
    1. Функция trim(string &), убирающая все пробелы, является расширением для string, и запись string.trim() точно отражает суть
    2. Функция display(string const &), отображающая строку, не является расширением и просто оперирует объектом string, и запись display(string) точно отражает суть

Идея
Расширить name lookup, чтобы вызовы вида "classInstance.classMethod(args...); " "искались" не только, как "ClassType::classMethod(args...)", но и как "extension classMethod(ClassType <const, volatile> &, args...)"; где extension - новое ключевое слово, говорящее, что  "classMethod(ClassType <const, volatile> &, args...) может быть найден" при "classInstance.classMethod(args...); ".
Детальнее - в примере.

extension void trim(string & s)
void display(string const & s);

// later
std::string str { " hello" }:

str.trim();   // Ok, possible
str.display() // Error, not allowed, not an "extension"

trim(str);     // Ok, also possible
display(str);  // Ok, the only possible

Детали
  1. "Расширяемый" тип данных должен быть указан первым аргументом
  2. "Расширяемый" тип данных должен быть передан по ссылке
  3. В функции-расширении доступны только публичные члены класса (альтернативно, можно дать доступ и к protected)

1
рейтинг
1 комментарий
Antervis

это предложение Герба Саттера "unified function call syntax" (который не торопятся принимать в стандарт) с добавлением extension'а (а вот эту штуку явно не хотят добавлять в стандарт).

Antervis
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения