Проблема со свободными функциями заключается в том, что они являются свободными функциями.
Я бы поспорил, что большинство из вас создали функцию, которая уже была предоставлена STL, потому что вы просто не знали, что функция STL существует, или что она может делать то, что вы пытались выполнить.
Это довольно удручающий дизайн, особенно для новых пользователей. (STL также получает новые дополнения, еще больше увеличивая проблему.)
Google: C ++ в строку
Сколько упомянуто результатов: std :: to_string
Я с такой же вероятностью найду какой-нибудь древний C-метод или самодельную версию, как и STL-версию любой данной функции.
Я очень предпочитаю методы-члены, потому что вам не нужно изо всех сил пытаться их найти, и вам не нужно беспокоиться о поиске старых устаревших версий и т. Д. (т. е. string.SomeMethod, в значительной степени гарантированно будет тем методом, который вам следует использовать, и он даст вам кое-что конкретное для Google.)
Методы расширения в стиле C # были бы хорошим решением.
- Они бесполезные функции.
- Они отображаются как функции-члены через intellisense.
Это должно позволить каждому делать именно то, что он хочет.
Похоже, что это может быть выполнено в самой IDE, а не требует каких-либо языковых изменений.
По сути, если интерпретатор выполняет какой-то вызов несуществующего члена, он может проверять заголовки на соответствие свободным функциям и динамически исправлять его, прежде чем передать его компилятору.
Нечто подобное можно сделать при загрузке данных intellisense.
Я понятия не имею, как это можно сделать для существующих функций, никакие массовые изменения не следует воспринимать легкомысленно, но для новых функций, использующих новый синтаксис, это не должно быть проблемой.
namespace StringExt
{
std::string MyFunc(this std::string source);
}
Это может быть использовано само по себе или в качестве члена std :: string, и IDE может обрабатывать всю тяжелую работу.
Конечно, это все еще оставляет проблему распространения методов по различным заголовкам, которая может быть решена различными способами.
- Какой-то заголовок расширения: string_ext, который может включать обычные методы.
- Хм ....
Сложнее решить проблему, не вызывая проблем ...