"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > मैं रनटाइम पर उनके नाम और मानों तक पहुंचने के लिए C++ में स्ट्रक्चर और क्लास सदस्यों पर पुनरावृति कैसे कर सकता हूं?

मैं रनटाइम पर उनके नाम और मानों तक पहुंचने के लिए C++ में स्ट्रक्चर और क्लास सदस्यों पर पुनरावृति कैसे कर सकता हूं?

2024-11-06 को प्रकाशित
ब्राउज़ करें:564

How can I iterate over struct and class members in C   to access their names and values at runtime?

संरचना और वर्ग के सदस्यों पर पुनरावृत्ति

सी में, किसी संरचना या वर्ग के सदस्यों के माध्यम से उनके नाम पुनः प्राप्त करने के लिए पुनरावृति करना संभव है और मूल्य. इसे प्राप्त करने के लिए यहां कुछ दृष्टिकोण दिए गए हैं:

मैक्रोज़ का उपयोग करना

रिफ्लेक्टेबल मैक्रो का उपयोग उन संरचनाओं को परिभाषित करने के लिए किया जा सकता है जो आत्मनिरीक्षण की अनुमति देते हैं। मैक्रो संरचना के सदस्यों को प्रकार-नाम जोड़े की अल्पविराम से अलग की गई सूची के रूप में परिभाषित करता है। उदाहरण के लिए:

struct A
{
    REFLECTABLE
    (
        (int) a,
        (int) b,
        (int) c
    )
};

एक बार संरचना परिभाषित हो जाने के बाद, आप इसके सदस्यों पर पुनरावृत्ति करने और उनके नाम और मान प्रिंट करने के लिए विज़िटर फ़ंक्शन का उपयोग कर सकते हैं:

struct print_visitor
{
    template
    void operator()(FieldData f)
    {
        std::cout 
void print_fields(T & x)
{
    visit_each(x, print_visitor());
}

A x;
print_fields(x);

संरचनाओं को फ़्यूज़न अनुक्रमों के रूप में अनुकूलित करना

एक अन्य दृष्टिकोण BOOST_FUSION_ADAPT_STRUCT मैक्रो का उपयोग करके संरचना को फ़्यूज़न अनुक्रम के रूप में अनुकूलित करना है। यह मैक्रो संरचना सदस्यों को संबंधित प्रकार और मान वाले तत्वों के अनुक्रम के रूप में परिभाषित करता है। उदाहरण के लिए:

struct A
{
    int a;
    int b;
    int c;
};

BOOST_FUSION_ADAPT_STRUCT
(
    A,
    (int, a)
    (int, b)
    (int, c)
)

एक बार संरचना अनुकूलित हो जाने के बाद, आप सदस्यों पर पुनरावृत्ति करने और उनके नाम और मान प्रिंट करने के लिए एक रेंज लूप का उपयोग कर सकते हैं:

struct print_visitor
{
    template
    void operator()(Index, C & c)
    {
        std::cout ::call() 
                  (c) 
                  
void print_fields(C & c)
{
    typedef boost::mpl::range_c::type::value> range;
    boost::mpl::for_each(boost::bind(print_visitor(), boost::ref(c), _1));
}

ये दोनों दृष्टिकोण आपको संरचनाओं और कक्षाओं का आत्मनिरीक्षण करने की अनुमति देते हैं, जो रनटाइम पर उनके सदस्यों और उनके मूल्यों तक पहुंच प्रदान करते हैं।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3