2010-10-10 14 views
6

कहना चलो हम इस कोड है:बहुरूपी ऑपरेटर [] कार्यान्वयन

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

वहाँ एक रास्ता मुहावरेदार सी compilable करने के लिए इसे परिवर्तित करने के लिए है ++?

यह

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

यानी की तरह दिखना चाहिए एक बहुलक ऑपरेटर []।

+0

यह बहुरूपता नहीं है। – SLaks

+2

@ स्लक्स: बेशक यह एक प्रकार का बहुरूपता है। –

उत्तर

7

क्या आप सकता है कर एक प्रॉक्सी वस्तु

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

वापस जाने के लिए आप obj.get<T>(index) करने या कुछ इसी तरह का सहारा भी कर सकते हैं।

+0

दिलचस्प समाधान। +1। – Puppy

+0

हाँ, उत्कृष्ट। यह वास्तव में काम करता प्रतीत होता है, मैंने प्रारंभिक शैली शैली को प्रॉक्सी के लिए कन्स्ट्रक्टर में बदल दिया, और reinterpret_cast <> का उपयोग किया लेकिन यह काम करता है! धन्यवाद। – berkus

+2

ओह। मूल कोड में डेटा को टी की सरणी के रूप में माना जाता था। उपरोक्त में उपयोगकर्ता की अनुक्रमणिका 'i' डेटा के बाइट से शुरू होने वाले 'sizeof (T)' बाइट्स का चयन करती है ... –

संबंधित मुद्दे