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