C++: вызов функций-нечленов с тем же синтаксисом, что и функций-членов

C++: вызов функций-нечленов с тем же синтаксисом, что и функций-членов
C++: вызов функций-нечленов с тем же синтаксисом, что и функций-членов - eddybllrd @ Unsplash

Одна вещь, которую я хотел бы сделать в C++, - это вызов функций-нечленов с тем же синтаксисом, с которым вы вызываете функции-члены:

class A { };
void f( A & this ) { /* ... */ }
// ...
A a;
a.f(); // this is the same as f(a);

Конечно, это может работать только до тех пор, пока

  • f не является виртуальной (поскольку она не может появиться в виртуальной таблице A.

  • f не нужно обращаться к непубличным членам A.

  • f не конфликтует с функцией, объявленной в A (A::f).

Я бы хотел такой синтаксис, потому что, на мой взгляд, он был бы достаточно удобным и подталкивал бы к хорошим привычкам:

  1. вызов str.strip() на std::string (где strip - функция, определенная пользователем) звучал бы гораздо лучше, чем вызов strip( str );.

  2. В большинстве случаев (всегда?) классы предоставляют некоторые функции-члены, которые не обязаны быть членами (т.е. не являются виртуальными и не используют непубличные члены). Это нарушает инкапсуляцию, но является наиболее практичным (в силу пункта 1).

Мой вопрос заключается в следующем: что вы думаете о такой функции? Как вы думаете, это будет что-то хорошее, или что-то, что создаст больше проблем, чем те, которые она призвана решить? Может быть, имеет смысл предложить такую возможность в следующий стандарт (тот, что после C++0x)?


Конечно, это лишь краткое описание данной идеи; оно не является полным; вероятно, нам потребуется явно обозначить функцию специальным ключевым словом, чтобы она работала подобным образом, и многое другое.

Что касается вашего № 2: На самом деле, создание функций, не являющихся членами, часто увеличивает инкапсуляцию, как заметил Скотт Мейерс более десяти лет назад.

Во всяком случае, то, что вы описываете, очень похоже на методы расширения С#. Они хороши, чтобы успокоить умы тех, кто напуган, увидев совершенно бесплатные функции. :) Как только вы отважитесь на STL (которая, кстати, не является стандартной библиотекой, а лишь той ее частью, которая исходит из оригинальной STL), где почти все функции настолько свободны, что они даже не настоящие функции, а функции шаблоны, они вам больше не понадобятся.

Вкратце: не пытайтесь изменить язык, чтобы приспособить его к своему мышлению. Вместо этого улучшите свое мышление, чтобы принять философию языка. От этого вы станете немного выше.


LetsCodeIt, 8 июня 2023 г., 06:35