2010-10-10 4 views
6

Disons que nous avons ce code:opérateur polymorphes [] la mise en œuvre

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; 
} 

Est-il possible de le convertir en C++ compilable idiomatiques?

Il devrait ressembler à

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

à savoir un opérateur polymorphe [].

+0

Ce n'est pas du polymorphisme. – SLaks

+2

@ SLaks: Bien sûr, c'est un type de polymorphisme. –

Répondre

7

Ce que vous pourrait faire est de retourner un objet 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; 
} 

Vous pouvez recourir à obj.get<T>(index) ou à quelque chose de trop similaire.

+0

Solution intéressante. +1 – Puppy

+0

Yay, excellent. Cela semble vraiment fonctionner, j'ai remplacé l'initializer style init par constructeur pour Proxy, et utilisé reinterpret_cast <> mais ça marche! Je vous remercie. – berkus

+2

Oups. Dans le code d'origine, les données étaient traitées comme un tableau de T. Dans ce qui précède, l'index de l'utilisateur 'i' sélectionne les' sizeof (T) 'octets commençant par le' i''ième octet des données ... –