2016-03-28 6 views
5

में ओवरलोडिंग ** पायथन में, हमारे पास एक मनमाने ढंग से इंट/फ्लोट करने के लिए एक अच्छा सरल वाक्यविन्यास है। अर्थात्, के लिए आप गैर अजगर प्रोग्रामर, हम निम्नलिखित बयान हो सकता है:सी ++

y = 2 ** 3 
print y 

इस कंसोल के लिए 8 प्रिंट होगा, और अच्छा वाक्यविन्यास है के रूप में वहाँ है "सत्ता" ऑपरेटर में एक का निर्माण किया। क्या सी ++ में एक ऑपरेटर के रूप में "**" अधिभार करना संभव है? विशेष रूप से, मैं कुछ इस तरह पूरा करने के लिए करना चाहते हैं:

int a = 2; 
int b = 3; 
cout << (a**b) << endl; 

या, यदि यह संभव है, कुछ इस तरह नहीं है:

MyInt a = new MyInt(2); // Wrapper class around ints to play nicely with ** 
MyInt b = new MyInt(3); 
cout << (a**b) << end; // Assume ostream overridden for MyInt 

ये भी कंसोल के लिए 8 प्रिंट चाहिए। मैं समझता हूं कि "^" ऑपरेटर को एक ही काम करने के लिए ओवरराइड करना अधिक आसान होगा, लेकिन मुझे यह देखने में दिलचस्पी है कि मैं "**" अधिभारित कर सकता हूं या नहीं। ऑपरेटर "*" (MyInt क्लास केस के लिए, यदि यह सदस्य फ़ंक्शन था) को देखना होगा कि तर्क एक और "*" था, क्योंकि मुझे "**" निर्दिष्ट करने के तरीके के बारे में पता नहीं है एक ऑपरेटर? क्या ऑपरेटर को तर्क के रूप में पास करना भी संभव है?

यदि संभव हो तो अतिरिक्त/बोनस शर्त (जैसे कि मैंने पहले ही पर्याप्त नहीं कहा है): कोई मैक्रोज़ !!!

+2

यह ऑपरेटर ओवरलोडिंग कहा जाता है, क्योंकि आप ऑपरेटरों को अधिभारित करते हैं। ** एक ऑपरेटर नहीं है। – DeiDei

+1

शक्ति के अर्थ में ऑपरेटर अधिभारित न करें, इसकी ==, + या उससे कम प्राथमिकता है - इसलिए इससे बहुत सारी आश्चर्य हो जाएगी। –

+0

@ ÖöTiib महान बिंदु! – mwm314

उत्तर

4

आपका मतलब कुछ ऐसा है?

#include <iostream> 
#include <cmath> 

struct MyInt { 
    int val; 
    struct MyProxy { int val; }; 

    MyProxy operator *() const{ return MyProxy{val}; } 
    MyInt operator * (const MyProxy& b) { return MyInt{ static_cast<int>(std::pow(val, b.val)) }; } 

}; 

std::ostream& operator << (std::ostream& o, const MyInt& m) { return o << m.val; } 

int main(){ 
    MyInt a{5}, b{3}; 
    std::cout << a**b << std::endl; 
} 

इसे यहाँ रहते देखें http://coliru.stacked-crooked.com/a/ab56b9cd6e422e12

स्पष्टीकरण:

  1. अधिभार एकल * एक प्रॉक्सी वस्तु लौटने के लिए
  2. अधिभार द्विआधारी * प्रॉक्सी का उपयोग करने ऑपरेटर ऑपरेटर सरल ... :-)
  3. सूक्ष्म बग से बचने के लिए मैंने प्रॉक्सी क्लास का उपयोग किया ..

सी ++ मज़ा है ... मैं तो बस फोन आप इस और उत्पादन में नहीं मनोरंजन के लिए कर रहे हैं विश्वास करने के लिए ... क्योंकि इसके उत्पादन में एक बहुत बुरा विचार चाहते हैं, std::pow

+1

सिर्फ इसलिए कि कुछ संभव है, इसका मतलब यह नहीं है कि यह एक अच्छा विचार है ... –

+2

हाँ ... मुझे पता है :-) ... मुझे विश्वास है कि ओपी मज़े के लिए ऐसा करना चाहता है, उत्पादन कोड में नहीं – WhiZTiM

+0

बस स्पष्ट और स्पष्ट होने के लिए: यह खेलने के लिए एक मजेदार छोटा खेल हो सकता है (और मैं खुले तौर पर स्वीकार करूंगा, मैंने इसे स्वयं किया है, और इसका आनंद लिया), लेकिन ** ** इसे उत्पादन कोड में नहीं करें , या पूरी तरह से फेंकने वाले कोड को छोड़कर कुछ भी, केवल एक खेल खेलने का आनंद लेने के लिए लिखा गया है। –

4

संक्षिप्त उत्तर: नहीं। सी ++ में मनमाना चरित्र/टोकन अनुक्रमों को "ओवरलोड" करने का कोई तरीका नहीं है।

लंबे समय तक जवाब:a**ba * (*b) के बराबर है, तो आप सकता है कुछ सकल तरह से अधिभार दोनों द्विआधारी * (अर्थात गुणा) और एकल * (अर्थात भिन्नता)। लेकिन यह आपके कोड को पढ़ने वाले किसी भी व्यक्ति के लिए पूरी तरह से अपारदर्शी/अप्रत्याशित होगा, और भविष्य में डीबग/बनाए रखने के लिए दर्दनाक होगा।

बस pow() नामक एक फ़ंक्शन लिखें!

+0

यह एक बहुत गंदे चाल है। – mwm314

+0

मुझे लगता है कि एक ऑपरेटर को तर्क के रूप में पास करना संभव नहीं है? – mwm314