Considere el uso de una estructura de etiquetas
struct tagPosition {};
struct tagDirection {};
struct tagGeneric {};
namespace detail
{
template <typename Tag=tagGeneric>
class Vector3
{
// business as usual
};
}
typedef detail::Vector3<tagPosition> Position;
typedef detail::Vector3<tagDirection> Direction;
typedef detail::Vector3<tagGeneric> Vector3;
Para los puntos de bonificación, tienen los operadores de conversión/constructores:.
template <typename Tag=tagGeneric>
class Vector3
{
template <typename OtherTag>
explicit Vector3(const Vector3<OtherTag>& rhs) { /* ... */ }
// template <typename OtherTag>
// operator Vector3<OtherTag>() const { return /* ... */ }
};
Si te gusta vivir peligrosamente le puede descartar la palabra clave explicit
o habilitar el operador de conversión implícita. Esto tendría el 'beneficio' de ser capaz de permitir que promiscuos resoluciones operador de este modo:
Position pos;
Direction dir;
Generic gen;
dir = gen + pos; // you see why I call it 'promiscuous'?
Me gustaría recomendar (lugar) para definir los operadores explícitas para casos como este (funciones gratuitas :)
Position operator+(const Position& v, const Translation& d) { /* .... */ }
De esta forma, su modelo de clase refleja la semántica de sus clases.
C++0x would possibly contain things to enable explicit conversion operators, IIRC:
En el caso de los constructores conversión, puede desactivar las conversiones implícitas al declarar el constructor tan explícito El N1592 proposal extiende la semántica de esta palabra clave para todos los operadores de conversión. Un operador de conversión declarado explícito no realizará una conversión implícita. En su lugar, el programador tendrá que llamar explícitamente
El problema con esto es que las posiciones son convertir implícitamente a vectores (y que técnicamente hablando, Vector ahora deben tener un destructor virtual con el fin de ser utilizado con seguridad) – jalf
@jalf : ¿Es realmente necesario el destructor virtual incluso cuando la clase derivada no agrega ningún dato o método? –
jalf: Discuto el tema de las conversiones en mi respuesta – sehe