Нет добавленной стоимости для static
функций-членов, как вы правильно определили.Хуже того, когда используется для деталей реализации, это создает дополнительные зависимости (в терминах компиляции).
Использование only , которое не может быть эмулировано с анонимной свободной функцией, это protected
доступ, то есть производный класс, обращающийся к родительской статической функции.Однако это никогда не требуется: вместо этого вы можете просто сделать его обычной функцией-членом (я предполагаю, что у вас нет глобального состояния, в противном случае различие между статическим и другом не имеет непосредственного значения).
Использованиеstatic
функции в шаблонном метапрограммировании были вызваны ... однако это очень похоже на проблему внутренних типов: это затрудняет предоставление версии по умолчанию.С другой стороны, надлежащим образом определенная свободная функция (которая принимает тип в качестве указателя) может предложить версию шаблона:
struct some_traits
{
static void doStuff();
};
// versus
struct some_traits {};
void doStuff(some_traits*);
// and the default: void doStuff(...);
И, конечно, всегда возникает вопрос, почему это должно бытьстатическая функция, когда функция-член обеспечивает большую гибкость для пользователя.В связи с этим я хотел бы привести ход, сделанный Стандартным комитетом с концепцией Allocator
: распределители с сохранением состояния теперь авторизованы, что дает нам возможность упаковывать узлы данного map
на одной странице, а не распространять их по всемукуча.
Наконец, существует проблема interface .Однако уже давно прошло с тех пор, как Саттер отстаивал, что класс и свободные функции, определенные в одном и том же заголовке, представляют собой открытый интерфейс этого класса =>, для чего предназначен ADL!Так что это больше, чем утешать древних OO-программистов, чем «хорошая практика».
Действительно, я не вижу никакой пользы от использования static
функций-членов.Я хотел бы, чтобы люди думали об обратном, предлагая реальные случаи.