2012-07-25 11 views
5

क्या struct के अंदर "वर्तमान struct का प्रकार" प्राप्त करना संभव है?संरचना/कक्षा के अंदर "वर्तमान प्रकार" के बारे में जानकारी कैसे प्राप्त करें?

struct foobar { 
    int x, y; 

    bool operator==(const THIS_TYPE& other) const /* What should I put here instead of THIS_TYPE? */ 
    { 
    return x==other.x && y==other.y; 
    } 
} 

मैं इसे इस तरह से करने की कोशिश की: उदाहरण के लिए, मैं इस तरह कुछ करना चाहता हूँ

struct foobar { 
    int x, y; 

    template<typename T> 
    bool operator==(const T& t) const 
    { 
    decltype (*this)& other = t; /* We can use `this` here, so we can get "current type"*/ 
    return x==other.x && y==other.y; 
    } 
} 

लेकिन यह बदसूरत लग रहा है, नवीनतम सी ++ स्टैंडर्ड, और MSVC connot के समर्थन की आवश्यकता है इसे संकलित करें (यह "एक आंतरिक त्रुटि" के साथ दुर्घटनाग्रस्त हो जाता है)।

वास्तव में, मैं सिर्फ कुछ पूर्वप्रक्रमक मैक्रो लिखना चाहते operator== जैसे कार्यों को स्वत: जनरेट:

struct foobar { 
    int x, y; 
    GEN_COMPARE_FUNC(x, y); 
} 

struct some_info { 
    double len; 
    double age; 
    int rank; 
    GEN_COMPARE_FUNC(len, age, rank); 
} 

लेकिन मैं मैक्रो के अंदर "वर्तमान प्रकार" पता करने की जरूरत।

+1

क्यों बस नहीं अपने मैक्रो GEN_COMPARE_FUNC (foobar, एक्स, वाई) के बजाय? 'Variadic Macros' के माध्यम से – Rollie

+0

@ForEveR। यह जीसीसी और एमएसवीसी द्वारा समर्थित है, इसलिए यह मेरे लिए पर्याप्त है। – qehgt

+0

एक टेम्पलेटेड 'बूल ऑपरेटर ==' का उपयोग करके, आप गलती से दो प्रकार की तुलना करना संभव बना सकते हैं जहां उनके लिए तुलनीय होने के लिए यह समझ में नहीं आता है। –

उत्तर

0

वास्तव में, आप इस तरह somethink का उपयोग कर सकते हैं।

#define GEN_COMPARE_FUNC(type, x, y)\ 
template<typename type>\ 
bool operator ==(const type& t) const\ 
{\ 
    return this->x == t.x && this->y == t.y;\ 
} 

struct Foo 
{ 
    int x, y; 
    GEN_COMPARE_FUNC(Foo, x, y); 
}; 

मुझे नहीं पता कि var का उपयोग कैसे करें। इस तरह से मैक्रो-पार (हमें पैरा को फेंकने और टी से प्रत्येक पैरा की तुलना करने की आवश्यकता है, मुझे नहीं पता, मैक्रो में पैरा कैसे विस्तारित करें)।

0

यह ढेर-अतिप्रवाह यूआरएल राज्यों बढ़ावा पुस्तकालयों एक अभिव्यक्ति के प्रकार की गणना है कि सकता है, लेकिन C/C++ से ही नहीं कर सकते हैं:

:

Getting name and type of a struct field from its object

किसी ने एक ऐसे ही सवाल यह भी पूछा How can I add reflection to a C++ application?

का उपयोग कर typeof typeof हेडर को शामिल शुरू करने के लिए:

#include <boost/typeof/typeof.hpp> 

संकलन समय पर एक अभिव्यक्ति के प्रकार के अनुमान के लिए BOOST_TYPEOF मैक्रो का उपयोग:

namespace ex1 
{ 
    typedef BOOST_TYPEOF(1 + 0.5) type; 

    BOOST_STATIC_ASSERT((is_same<type, double>::value)); 
} 
+0

सी ++ 11 कर सकते हैं। typedef decltype (1 + 0.5) प्रकार; – ForEveR

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

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