2011-10-07 19 views
5

मेरे पास एक क्लास ए है जिसमें टेम्पलेट पैरामीटर टी है। ऐसे मामले हैं जहां कक्षा टी फ़ंक्शन func1() प्रदान करता है और ऐसे मामले हैं जहां टी नहीं है इसे पेश नहीं करते हैं। ए में फ़ंक्शन f() को func1(), iff यह मौजूद होना चाहिए। मुझे लगता है कि बूस्ट एमपीएल के साथ यह संभव होना चाहिए, लेकिन मुझे नहीं पता कि कैसे। यहाँ कुछ छद्म कोड:बूस्ट एमपीएल: केवल एक (सदस्य) फ़ंक्शन को कॉल करें यदि यह मौजूद है

template<class T> 
class A 
{ 
    void f(T param) 
    { 
     if(T::func1 is an existing function) 
      param.func1(); 
    } 
}; 

और भी बेहतर एक और को-मामला होगा:

template<class T> 
class A 
{ 
    void f(T param) 
    { 
     if(T::func1 is an existing function) 
      param.func1(); 
     else 
      cout << "func1 doesn't exist" << endl; 
    } 
}; 
+2

भले ही आप उचित स्थिति ढूंढ सकें कि कोड संकलित नहीं होगा। यदि दोनों शाखाओं को संकलित करना चाहिए, और यदि कार्य मौजूद नहीं है, तो सत्य शाखा संकलित नहीं होगी। –

+0

टेम्पलेट विशेषज्ञता के साथ यह आवश्यक नहीं है कि दोनों भागों संकलित हों। किसी भी तरह मुझे पैरामीटर टी के साथ एक टेम्पलेट फ़ंक्शन को कॉल करना होगा और यह फ़ंक्शन एक भिन्न व्यवहार होता है जब टी ऑफर करता है या func1() प्रदान नहीं करता है। मुझे यकीन है कि बूस्ट एमपीएल इस उपयोग के मामले के लिए कुछ प्रदान करता है। मुझे नहीं पता कि इसका उपयोग कैसे किया जाए। – Heinzi

+0

सी ++ 11 एक विकल्प है? –

उत्तर

7

Boost.MPL कि के साथ सौदा नहीं है कि यह TMP के लिए सख्ती से है के रूप में और आप सदस्यों कॉल नहीं कर सकते टीएमपी में बूस्ट.फ्यूजन और बूस्ट। टाइप ट्राइट्स में कुछ भी नहीं है; मैंने सोचा कि उनमें से एक होगा लेकिन स्पष्ट रूप से मैं गलत समझा रहा हूं।

Here और here सी ++ 03 में किसी सदस्य का पता लगाने के लिए एक विशेषता लिखने के तरीके पर कुछ समाधान हैं। ,

template<typename T> 
typename boost::enable_if<has_func1_member<T> >::type 
maybe_call(T& t) 
{ t.func1(); } 

template<typename T> 
typename boost::disable_if<has_func1_member<T> >::type 
maybe_call(T&) 
{ 
    // handle missing member case 
} 

// your example code would then do: 
maybe_call(param); 

ध्यान दें कि साथ सी ++ 11 यह आसान है पहली जगह में विशेषता लिखने के लिए हालांकि यह अभी भी है: एक बार जब आप इस तरह के एक विशेषता है (मैं इसे has_func1_member फोन करता हूँ), तो आपको SFINAE के लिए उपयोग कर सकते हैं कुछ हद तक आर्केन।

+0

क्या आपको वास्तव में इसे स्वयं लिखना होगा? क्या is_member_function_pointer चाल नहीं करता है? http://en.cppreference.com/w/cpp/types/is_member_function_pointer या बूस्ट में: http://www.boost.org/doc/libs/1_51_0/libs/type_traits/doc/html/boost_typetraits/reference/is_member_function_pointer .html – Gurgeh

+0

@ गुर्जे इन सी ++ 03 यह मदद नहीं करता है। सी ++ 11 में आप कुछ ऐसा लिखने में सक्षम हो सकते हैं जो काम करता है लेकिन यह ओवरलोडेड सदस्य फ़ंक्शंस (झूठी नकारात्मक रिपोर्ट करेगा) के साथ असफल हो जाएगा और उस कमी के बिना इसे करने के आसान तरीके हैं। –

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