2012-02-05 5 views
5

Me preguntaba si alguien sabe cuáles son los límites en el operador de conversión/conversión.¿Hay algún límite en los tipos en el operador de typecast?

Así, por ejemplo, que pueden tener los siguientes operadores de anulación:

class Test { 
    operator int() { return 0; }; 
    operator int*() { return nullptr; }; 
} 

Para una función regular, yo también podría tener un puntero al tipo de matriz. P.ej.

int (*MyFunc())[4] { return nullptr; }; 

Sin embargo, no sé cómo hacer lo mismo para el operador de conversión (o si es incluso legal de hacerlo). He intentado algunas variaciones diferentes y VS2010 y ninguno funciona. (Tales como :)

operator int (*())[4] { return nullptr; }; 
operator int(*)[4]() { return nullptr; }; 

No estoy seguro si esto es una limitación en VS2010 o si hay un límite general sobre los tipos que se pueden utilizar en el operador de conversión. Intenté buscar el estándar en línea sin suerte. ¿Alguien sabe? Antes de que alguien pregunte "¿por qué querrías hacer eso?", Es para código generado automáticamente. Aunque no anticipo que vaya a obtener un puntero para la entrada de matriz, me gustaría poder producir el código si es legal en C++.

Respuesta

3

Sí, hay restricciones. La limitación que has golpeado con las matrices se debe a la gramática del lenguaje. La especificación de la gramática para un operador de conversión (y amigos) es el siguiente:

 
§12.3.2 
conversion-function-id: 
    operator conversion-type-id 
conversion-type-id: 
    type-specifier-seq conversion-declarator[opt] 
conversion-declarator: 
    ptr-operator conversion-declarator[opt] 

§7.1.6 
type-specifier: 
    trailing-type-specifier 
    class-specifier 
    enum-specifier 
trailing-type-specifier: 
    simple-type-specifier 
    elaborated-type-specifier 
    typename-specifier 
    cv-qualifier 
type-specifier-seq: 
    type-specifier attribute-specifier-seq[opt] 
    type-specifier type-specifier-seq 
trailing-type-specifier-seq: 
    trailing-type-specifier attribute-specifier-seq[opt] 
    trailing-type-specifier trailing-type-specifier-seq 

lo dejo como ejercicio para el lector a mirar a todos aquellos, pero no se puede especificar una matriz como el tipo directamente. (. Sólo se especifica en declaraciones) Afortunadamente, sin embargo, se permite que un nombre typedef (a través del nombre de tipo especificador), y porque un typedef es una especie de declaración, las matrices trabajan allí:

struct Test { 
    typedef int operator_type[4]; 

    operator operator_type*() { return nullptr; }; 
}; 

Para abreviar, use un typedef y puede usar el tipo que desee.

+0

Gracias. Eso ha respondido mi pregunta exactamente. –

+0

¿Comentario anterior? – GManNickG

6

Debe utilizar sobre todo en construcciones typedef duros, también se tiene la sintaxis incorrecta,

operator Type() {}

Voy uso typedef s aunque

typedef int (*foo())[4]; 
typedef int(*bar)[4]; 

utilizando el typedef

operator foo() { return nullptr; } // aquí intenta convertir nullptr a una "función" que devuelve el puntero a una matriz de 4 int, lo cual es obviamente incorrecto.

operator bar() { return nullptr; } // su segunda conversión es válida sin embargo, ya que está convirtiendo a nullptrpuntero a gama de 4 int s

+0

Sí, esperaba evitar el uso de typedef, pero creo que no hay otra opción. –

Cuestiones relacionadas