2012-05-15 26 views
14

He estado leyendo this similar question y no estoy satisfecho con las respuestas. No tengo una función simple llamada "foo"; Tengo una función mucho más compleja que tiene peligros muy reales si los parámetros no se proporcionan juiciosamente. Me parece preferible para la función hacer cumplir sus propias reglas y garantizar la robustez del sistema que inclinarse hacia las sutilezas semánticas que insisten en "una función, una cosa para hacer". Creo que las respuestas preferidas a esa pregunta reflejan el idealismo de programación llevado demasiado lejos, no la realidad de ciertas situaciones.¿Es posible especificar un std :: vector vacío como parámetro predeterminado?

Lo que enfrentamos es:

void DoSomethingVeryComplex(const CRect bounds, CPoint startPoint = CPoint(-1,-1)); 

Ahora bien, esto sucede para satisfacer las reglas semánticas - que está haciendo algo, no varias cosas. Lo único que está sucediendo es complejo y tiene varias etapas, pero sigue siendo una cosa.

Para esa cosa compleja, se recomienda que el usuario proporcione los límites y deje que la función determine su propio punto de partida. Los usuarios avanzados tal vez quieran hacer cálculos considerables para determinar un punto de partida alternativo específico y suministrar eso ... pero los usuarios deben tener cuidado.

Y ahora he llegado a ver que, en raras ocasiones, tiene sentido proporcionar no uno, sino varios puntos de partida. Esto no cambia nada en el concepto semántico del proceso involucrado, porque el proceso es uno que se extiende de un punto a los vecinos, a los vecinos de los vecinos, y así sucesivamente. Entonces, comenzar desde muchos puntos es una extensión natural.

acuerdo con esto, yo preferiría especificar:

void DoSomethingVeryComplex(const CRect bounds, 
          const std::vector<CPoint> startPoint /* = empty" */); 

de manera que si el vector está vacía, la función determina el punto de inicio como antes, y si hay algún punto en el vector, que se utilizan como punto (s) de inicio

¿Hay una sintaxis C++ disponible que me permita hacer esto - especificar una matriz vacía como parámetro predeterminado?

Respuesta

23

en C++ 11, es más simple:

const std::vector<CPoint> startPoint = {} 

Antes de eso, esto va a funcionar:

const std::vector<CPoint> startPoint = std::vector<CPoint>() 

Ambos invocar el constructor por defecto, lo que crea un vector vacío. Tenga en cuenta que la misma sintaxis puede usarse para llamar a otros constructores también, siempre y cuando complete los argumentos apropiados.

//this one has 5 default-constructed CPoints 
const std::vector<CPoint> startPoint = std::vector<CPoint>(5) 

En C++ 11, incluso se puede llenar un vector predeterminado:

const std::vector<CPoint> startPoint = {CPoint(1, 2), CPoint(4, 5), CPoint(3, 9)} 

Si quieres que tipo de capacidad para sus propias clases, here's a link on how it works.

+0

Dale un golpe. +1 – Martol1ni

+0

¡Gracias! Sabía que tenía que haber alguna forma de hacerlo. No estoy seguro de que realmente quiera hacerlo, podría ser más claro no tener un parámetro predeterminado ... pero hay fajos de código heredado para cambiar si elimino el antiguo parámetro predeterminado. – omatai

+0

@omatai, de hecho no es nada agradable ir a través del código antiguo para llevarlo al nivel estándar. – chris

Cuestiones relacionadas