Я читал через этот похожий вопрос и оказался менее удовлетворенным ответами. У меня нет простой функции, называемой "foo"; У меня есть гораздо более сложная функция, которая имеет очень реальные опасности, если параметры не предоставляются разумно. Мне кажется предпочтительным, чтобы функция выполняла свои собственные правила и обеспечивала надежность системы, а не стремление к смысловым тонкостям, которые настаивают на "одной функции, одной вещи". Я думаю, что одобренные ответы на этот вопрос отражают идеализм программирования, взятый слишком далеко, а не реальность определенных ситуаций.
С чем я сталкиваюсь:
void DoSomethingVeryComplex( const CRect bounds, CPoint startPoint = CPoint(-1,-1) );
Теперь это происходит, чтобы удовлетворить семантические правила - это что-то делает, а не несколько вещей. Единственное, что он делает, бывает сложным и многоуровневым, но это все еще одно.
Для этой сложной вещи рекомендуется, чтобы пользователь предоставил границы, и пусть функция определит свою собственную отправную точку. Продвинутые пользователи могут захотеть сделать значительную математику, чтобы определить конкретную альтернативную отправную точку и предоставить ее... но пользователи остерегаются.
И теперь я пришел посмотреть, что в редких случаях имеет смысл поставлять не одну, а несколько отправных точек. Это ничего не меняет в семантической концепции вовлеченного процесса, потому что процесс - это тот, который распространяется от одной точки к соседям, соседям соседей и т.д. Поэтому, начиная со многих точек, это естественное расширение.
Соответственно, я бы предпочел указать:
void DoSomethingVeryComplex( const CRect bounds,
const std::vector<CPoint> startPoint /* = empty" */ );
так что, если вектор пуст, функция определяет начальную точку, как и раньше, и если в векторе есть какие-либо точки, они используются как начальная точка (ы).
Имеется ли синтаксис С++, который позволяет мне это сделать - указать пустой массив как параметр по умолчанию?