Функции (методы) расширения

mezastel
mezastel

В текущей парадигме, чтобы добавить то или иное поведение классу, который нельзя менять, используются глобальные функции. Типичный пример - это строковые алгоритмы в Boost вроде boost::to_lower_copy(). Проблема с этими функциями - они все глобальны, их сложно искать, и цепочные вызовы таких функций вылгядят как f(g(x)) вместо x.g().f(). Хочется получать то же, что имеют разработчики C#, где методы расширения реализуются специальным ключевым словом.

Я предлагаю в С++ сделать то же самое вплоть до синтаксиса, то есть

namespace std
{
  static std::string to_lower_copy(this string s)
  {
    ...
  }
}

Ключевое слово this тут помечает функцию как функцию-расширение, так что ее можно использовать

  • Естественным путем, т.е. my_string.to_lower_copy()
  • Статическим путем, т.е. std::to_lower_copy(my_string)

Второй способ нужен в случае коллизий между member functions и extension functions.

3
рейтинг
1 комментарий
yndx-antoshkka
Этим уже занимаются Bjarne Stroustrup и Herb Sutter: open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0251r0.pdf
yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).