2010-10-10 7 views
6

digamos que tenemos este código:operador polimórfica [] aplicación

class test_t 
{ 
    void* data; 
public: 
    template <typename T> 
    T operator [](int index) 
    { 
     return reinterpret_cast<T*>(data)[index]; 
    } 
}; 

int main() 
{ 
    test_t test; 
    int t = test.operator []<int>(5); 
    return 0; 
} 

¿Hay una manera de convertirlo en compilables C++ idiomática?

Debe quedar como

int main() 
{ 
    test_t test; 
    int t = test[5]; 
    double f = test[7]; 
    return 0; 
} 

es decir, un operador polimórfico [].

+0

Eso no es polimorfismo. – SLaks

+2

@SLaks: Por supuesto que es un tipo de polimorfismo. –

Respuesta

7

Lo que podía hacer es devolver un objeto proxy

struct Proxy { 
    template<typename T> 
    operator T() { 
     return static_cast<T*>(data)[index]; 
    } 
    void *data; 
    int index 
}; 

Proxy operator [](int index) 
{ 
    Proxy p = { data, index }; 
    return p; 
} 

Puede recurrir a obj.get<T>(index) o algo similar también.

+0

Solución interesante. +1. – Puppy

+0

Yay, excelente. Esto realmente parece funcionar, reemplacé el init del estilo de inicializador para el constructor Proxy, y usé reinterpret_cast <> pero funciona! Gracias. – berkus

+2

¡Vaya! En el código original, los datos se trataron como una matriz de T. En lo anterior, el índice del usuario 'i' selecciona los bytes' sizeof (T) 'comenzando en el' i''th byte de los datos ... –

Cuestiones relacionadas