2012-10-24 17 views
8

चलो कहते हैं कि मैं एक सी करते ++ तरहत्रिगुट ऑपरेटर और समारोह हस्ताक्षर

class MyClass 
{ 
    bool Foo(int val); 
    bool Foo(string val); 
} 

दो कार्यों के साथ वर्ग के लिए यह संभव इस

MyClassInstance->Foo(booleanValue?24:"a string"); 

तरह त्रिगुट ऑपरेटर का उपयोग करें और MyClass का एक अलग समारोह के लिए है booleanValue के मूल्य के आधार पर आविष्कार किया गया?

+2

इस दिलचस्प है ... – mauris

+6

आप संकलन और यह देखने के लिए कि क्या होता है चलाने का भी प्रयास किया है? –

+0

यह संकलित भी नहीं करता है। कंपाइलर विभिन्न प्रकार के टर्नरी ऑपरेटर के बारे में शिकायत करेगा। –

उत्तर

21

टर्नरी ऑपरेटर के साथ नहीं। एक टर्नरी अभिव्यक्ति का प्रकार अपने दूसरे और तीसरे ऑपरेशंस का सामान्य प्रकार है; अगर उनके पास कोई आम प्रकार नहीं है तो आप इसका उपयोग नहीं कर सकते हैं।

if (booleanValue) 
    MyClassInstance->Foo(24); 
else 
    MyClassInstance->Foo("a string"); 
5

नहीं ओवरलोड रिज़ॉल्यूशन करने के लिए संकलक पूछेंगे "booleanValue?24:"a string" का प्रकार क्या है?"। उस सवाल का उत्तर नहीं दिया जा सकता है।

+0

का उत्तर नहीं दिया जा सकता * संकलन समय पर * (मेरा डाउन-वोट बीटीडब्लू नहीं - सिर्फ जवाब सुधारने के लिए एक छोटा सुझाव दे रहा है) –

+0

@ पॉल इन सी ++ एक्सप्रेशन में केवल संकलन- पहर। किसी और चीज के बारे में बात करना समझ में नहीं आता है। –

+0

हां, मुझे पता है, बिंदु यह है कि यह * कल्पनाशील * है कि आप निर्धारित कर सकते हैं कि कौन सा फ़ंक्शन गतिशील रूप से कॉल करने के लिए, यानी रन-टाइम पर, लेकिन सी ++ के लिए आपको संकलन-समय पर प्रकार को जानने की आवश्यकता है। –

7

एक त्रिगुट सशर्त अभिव्यक्ति के प्रकार के आम प्रकार दो जो दोनों ऑपरेंड चोर ­ ­ ver tible हैं: तो बस एक साधारण if बयान का उपयोग करें। आप निश्चित रूप से "डायनामिक ओवरलोड रिज़ॉल्यूशन" निष्पादित कर सकते हैं, जैसा कि आप सुझाव दे रहे हैं।

चूंकि int और char const * के लिए कोई सामान्य प्रकार नहीं है, तो कोड भी संकलित नहीं होगा (जैसा कि आप सुनिश्चित करते हैं कि ­ ly ने इसका परीक्षण किया था)।

(आप decltype साथ, पता चला है कि त्रिगुट सशर्त ठीक std::common_type विशेषता वर्ग टेम्पलेट के कार्यान्वयन में उन अर्थ विज्ञान की वजह से प्रयोग किया जाता है रोमांचित किया जा सकता है एक साथ।)

(हालत स्थिर में जाना जाता है , इस तरह के sizeof(int) != 7 के रूप में है, तो आप टेम्पलेट spe ­ सीआईए ­ lization का उपयोग समान दिखने वाले कोड सशर्त अधिभार संकल्प प्रदर्शन करता है, लेकिन निश्चित रूप से स्थिर है कि लिखने के लिए कर सकते हैं।)

5

नहीं, इसकी अनुमति नहीं है।

अधिभार संकलित समय हैं, इसलिए यह रनटाइम में इस तरह से काम नहीं कर सकता है।

यह आप वास्तव में ऐसा करना चाहते हैं लेकिन कभी कभी iostream के साथ वहाँ की तरह कुछ करने की इच्छा है कोड में आम नहीं है:

os << (condition ? var1 : var2)

जहां var1 और var2 विभिन्न प्रकार की है। यह भी काम नहीं करता है।

आप कर सकता है:

MyClassInstance->Foo(booleanValue ? boost::any(24) : boost::any("a string")); 
संबंधित मुद्दे