2010-04-10 7 views
5

Según el estándar, una función de conversión tiene una función-id operatorconversión-tipo-id, que se vería como, por ejemplo, operator char(&)[4] Creo. Pero no puedo averiguar dónde poner la lista de parámetros de función. gcc no acepta ninguno de operator char(&())[4] o operator char(&)[4]() o cualquier cosa que se me ocurra.¿Cuál es la forma ISO C++ para definir directamente una función de conversión para hacer referencia a una matriz?

Ahora, gcc parece aceptar (&operator char())[4] pero no lo hace, y me inclino a que tampoco, ya que no parece ajustarse a la gramática tal como la entiendo. No quiero usar un typedef porque quiero evitar contaminar el espacio de nombres con él.

Respuesta

9

Se puede utilizar la identidad

template<typename T> 
struct identity { typedef T type; }; 

struct sample { 
    operator identity<char[4]>::type &() { 
    ... 
    } 
}; 

Tiene razón en que la función y declaradores matriz no funcionarán en funciones de conversión. Esto también es conocido y discutido en this issue report. Sin embargo, creo que C++ 0x ya proporciona una solución a lo que hay que discutir

struct sample { 
    template<typename T> 
    using id = T; 

    template<typename T, int N> 
    operator id<T[N]> &() { 
    ... 
    } 
}; 

A diferencia del enfoque identity y typedef, esto permite T y N a deducir, creo.

+0

Bueno, supongo que es 'alias' * * técnicamente no es un typedef, pero ... : argh: – ben

+1

Huh, me encanta lo escueta que es la plantilla 'id'. – GManNickG

4

C++ no proporciona sintaxis para eso. Este es uno de esos casos cuando tiene para usar un tipodef-name para el tipo.

Con el fin de evitar la contaminación del espacio de nombres, es perfectamente bien para declarar el typedef-nombre dentro de la clase

struct S { 
    int a[4]; 

    typedef int A[4]; 
    operator A&() { return a; } 
}; 
Cuestiones relacionadas