2011-01-12 9 views
8

Tengo varias funciones con dos argumentos int (escribo las funciones y el código de llamada). Tengo miedo de confundir el orden del argumento en algunas llamadas.C++: uso de seguridad tipo para distinguir tipos de dos argumentos int

¿Cómo puedo usar el tipo de seguridad para que el compilador me advierta o me falte si invoco una función con una secuencia de argumentos incorrecta (todos los argumentos son int)?

me trataron typedef: typedef no provocan ningún advertencias del compilador o errores:

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

foo(y,x); // compiled without warning) 
+1

Puede encontrar algo como esto útil: http://calumgrant.net/units/units.html –

Respuesta

12

Deberá crear clases contenedoras. Digamos que tienes dos unidades diferentes (por ejemplo, segundos y minutos), ambas representadas como enter. Necesitaría algo como lo siguiente para ser completamente seguro:

class Minute 
{ 
public: 
    explicit Minute(int m) : myMinute(m) {} 
    operator int() const { return myMinute; } 

private: 
    int myMinute; 
}; 

y una clase similar por segundos. El constructor explícito le impide utilizar accidentalmente un int como Minute, pero el operador de conversión le permite usar un Minute en cualquier lugar donde necesite un int.

+5

Para una implementación más completa y genérica también puede consultar http://www.boost.org/doc/libs /1_42_0/boost/strong_typedef.hpp – UncleBens

4

typedef crea texto alias. Como has descubierto, no hay ningún tipo de seguridad allí.

Una posibilidad, dependiendo de lo que intente lograr, es usar enum. Eso tampoco es completamente seguro, pero está más cerca. Por ejemplo, no puede pasar un int a un parámetro enum sin convertirlo.

-5

Obtenga una nota de post-it. Escriba en letras grandes: "¡PRIMERO! ¡YA!" Colócalo en la pantalla de tu computadora. Honestamente, no sé qué más aconsejar. Usar clases de contenedor es sin duda excesivo, cuando el problema se puede resolver con un marcador y un marcador mágico.

+5

Pregunte a los desarrolladores de software geográfico. ¿Es lat/long o long/lat? Un caso clásico en el que las clases de contenedor funcionan, y su publicación no. – MSalters

Cuestiones relacionadas