2017-08-14 30 views
5

क्या किसी दिए गए struct के विभिन्न सदस्यों पर चलाने में सक्षम एक एकल टेम्पलेट फ़ंक्शन को कोड करने का कोई तरीका है?संरचना सदस्यों पर टेम्पलेट फ़ंक्शन

struct Foo 
{ 
    int a, b; 
} 

template <MEMBER x> //which does not exist 
cout_member(Foo foo) 
{ 
    cout << foo.x << endl; 
} 

int main() 
{ 
    Foo foo; 
    cout_member<a>(foo); 
    cout_member<b>(foo); 
    return 0; 
} 

मैं एक स्विच के आधार पर एक जवाब की कल्पना की है, लेकिन मैं तो आश्चर्य है कि अगर यह स्विच (रन-टाइम पर परीक्षण किया जाएगा मैं से बचने के लिए चाहते हैं क्या:

एक गलत उदाहरण जैसा दिखाई देगा) या संकलन समय पर?

+1

आपको इसकी आवश्यकता क्यों है? – user0042

+0

मैं एक 2 डी ग्रिड के लिए मिलकर आंशिक व्युत्पन्न समीकरणों के सिस्टम को हल कर रहा हूँ, और मैं प्रत्येक कोशिका के सभी भौतिक मात्रा के लिए एक भी अंतरिक्ष व्युत्पन्न समारोह करना चाहते हैं ... या कम से कम करने के लिए कार्यों की संख्या को कम करने के लिए कापी पेस्ट ! –

+0

संभवतः एक एक्सवाई समस्या अनिवार्य और बोझिल लगता है। –

उत्तर

10

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

template <int Foo::*M> 
void cout_member(Foo foo) 
{ 
    std::cout << (foo.*M) << std::endl; 
} 

और के रूप में इसका इस्तेमाल करते हैं:

cout_member<&Foo::a>(foo); 

आप भी प्रकार इंगित करना चाहते हैं, तो आप ऐसा कर सकते हैं:

template <typename T, T Foo::*M> 
void cout_member(Foo foo) 
{ 
    std::cout << (foo.*M) << std::endl; 
} 

और के रूप में इसका इस्तेमाल करते हैं:

cout_member<int, &Foo::a>(foo); 

बस जिज्ञासा से बाहर, दूसरा टुकड़ा सी ++ 17 में और भी आसान होगा:

template <auto M> 
void cout_member(Foo foo) 
{ 
    std::cout << (foo.*M) << std::endl; 
} 

इसे और पर wandbox चल देखें; आप धाराओं आप शायद परवाह नहीं है के बाद से उपयोग कर रहे हैं (untested)

template < typename Fun, typename ... Params > 
void print(Fun f, Params && ... p) { std::cout << f(std::forward<Params>(p)...) << "\n"; } 

print(std::mem_fn(&Obj::fun), Obj()); 

... लेकिन यह शून्य करने के लिए थोड़ा जोड़ना चाहिए:

+0

धन्यवाद! मैं सी ++ 17 संस्करण ले जाऊंगा! –

+0

बेशक! मुझे खेद है कि मैंने कुछ हौर्स पहले कोशिश की लेकिन मुझे यह समझने में काफी समय लगा कि यह कैसे करना है ... क्या यह अभी ठीक है? –

+0

@ valadeaurélien हाँ। और एसओ पर आपका स्वागत है। – skypjack

1

आप std::mem_fn लाभ उठा सकते हैं ताकि आप भी देखभाल करने के लिए नहीं है cout << obj.fun() लिखने से ऊपर की ओर।

संपादित करें: mem_fn डेटा सदस्यों पर भी काम करता है। एक कॉल करने योग्य बनाता है जो उस मान का संदर्भ देता है जिसका आप उपयोग कर सकते हैं: int x = mem_fn(&pair<int,char>::first)(my_pair);

+0

@skypjack - http://en.cppreference.com/w/cpp/utility/functional/mem_fn –

+0

मेले पर्याप्त। मैंने जवाब गलत समझा। धन्यवाद। – skypjack

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