2015-03-04 5 views
26

पूर्व नोट के रूप में: यह ऐसा कुछ नहीं है जिसे मैं प्राप्त करना चाहता हूं; अधिक तो एक सवाल यह है कि यह वास्तव में संभव है।क्या ऑपरेटर के रूप में मनमाना चरित्र का उपयोग करना संभव है?

एनबी। मैं समझता हूं (और उपयोग किया है) सी ++ में ऑपरेटर ओवरलोडिंग। उदाहरण के लिए:

std::ostream& operator<<(std::ostream& os, const T& obj){ return os; } 

यह एक कस्टम ASCII वर्ण एक ऑपरेटर के रूप में कार्य करने के लिए परिभाषित करने के लिए संभव है?

उदाहरण के लिए, एक साधारण अर्थ में: गंभीर उच्चारण (`) का उपयोग std :: pow के लिए 'उपनाम' के रूप में करें।

जिससे निम्नलिखित बयान वैध/प्राप्त होगा:

std::cout << 2`3 << std::endl; 

>> 8 
+0

नहीं। आप जो चाहते हैं उसे करने के लिए मौजूदा लोगों को अधिभारित कर सकते हैं, आप मैक्रोज़ के साथ भी परेशान हो सकते हैं ताकि प्रीप्रोसेसर उस दूसरे ऑपरेटर के साथ उच्चारण को बदल दे।कि एक अच्छा विचार है या नहीं एक और बात यह है जी के .. – stijn

+1

कस्टम निर्माण ++ ;-) – Matt

+0

आप के लिए एक [* उपयोगकर्ता परिभाषित शाब्दिक *] (http://en.wikipedia.org/wiki/C एक ऑपरेटर आपूर्ति कर सकता है % 2 बी% 2 बी 11 # उपयोगकर्ता परिभाषित_लिटर) प्रत्यय, उदाहरण के लिए 2.3_pow 2^3 का मतलब था - आपको एक अस्थायी टेम्पलेट मॉडल का उपयोग करना होगा, एक अस्थायी अला '<' 2 ','। ',' 3 '> ', या" 2.3 "_pow के लिए व्यवस्थित करें और' const 'को संभालें रनटाइम पर char * '। ऑपरेटर टेम्पलेट और बदसूरत लिखने के लिए थकाऊ होगा (यहां तक ​​कि भ्रामक 2.3 भी एक फ्लोट/डबल की तरह दिखता है) उपयोग में .... –

उत्तर

70

आप सिंटैक्स में उपस्थित नहीं होने वाले चरित्र को पेश नहीं कर सकते हैं, जैसे आपके द्वारा उल्लिखित बैकटिक। लेकिन वहाँ एक "named operator" trick जिसके साथ आप एक "नाम ऑपरेटर" लागू कर सकते हैं निम्न सिंटैक्स प्राप्त करने के लिए है:

std::cout << (2 <Pow> 3) << std::endl; 

चाल < और > अधिक भार एक कस्टम प्रकार के लिए, इस तरह पर निर्भर करता है:

const struct PowOperator {} Pow; 

struct PowInvoker 
{ 
    int lhs; 
}; 

PowInvoker operator< (int lhs, PowOperator) 
{ 
    return {lhs}; 
} 

int operator> (PowInvoker lhs, int rhs) 
{ 
    return std::pow(lhs.lhs, rhs); 
} 

int main() 
{ 
    std::cout << (2 <Pow> 3) << std::endl; 
} 

[Live example]

सूचना है कि आप इन नामित ऑपरेटरों की पूर्वता को प्रभावित नहीं कर सकते हैं: वे <, <=,के रूप में ही पूर्वता होगा, और >=। यदि आपको अलग-अलग प्राथमिकता की आवश्यकता है, तो आपको एक अलग डिलीमीटर का उपयोग करना होगा (जो शायद अच्छी तरह से पठनीय नहीं होगा)।


अस्वीकरण

ऊपर चाल है "चालाक" कोड है, यह काफी सी ++ वाक्य रचना का दुरुपयोग है। मैंने सवाल उठाया कि "क्या संभव है," और एक समान रूप से अनुमानित "यह है" के साथ उत्तर दिया। मैं std::pow को बदलने या इसके लिए "नवीनता" वाक्यविन्यास प्रदान करने के रूप में इस तरह के मामूली मामलों के लिए अभ्यास में इसका उपयोग करने की अनुशंसा करता हूं। उपरोक्त वर्णित ऑपरेटर प्राथमिकता चेतावनी एक कारण है; निर्माण की सामान्य अपरिचितता एक और है। कोड की गुणवत्ता को उत्पन्न करने वाले डब्ल्यूटीएफ की संख्या में मापा जाता है (कम बेहतर होता है), और यह चाल उनमें से एक समूह (और उस पर बड़े) उत्पन्न करती है।

इसका अभी भी उपयोग है: डोमेन-विशिष्ट भाषा बनाने के लिए। प्रोग्रामिंग में ऐसे मामले हैं जहां डीएसएल को सी ++ कोड में एम्बेड करना क्रम में है; ऐसे मामलों में (और ऐसे मामलों में केवल) क्या मैं इसका उपयोग करने पर विचार करूंगा।

+33

मैं किसी भी ऐसे व्यक्ति को विचलित कर दूंगा जो "असली" कोड में उपयोग करता है, लेकिन एक काल्पनिक प्रश्न के लिए एक दिलचस्प जवाब के लिए +1। – ApproachingDarknessFish

+4

@ApproachingDarknessFish 'std :: pow' को प्रतिस्थापित करने के लिए यह नहीं है, लेकिन यह कुछ स्थितियों के लिए व्यवहार्य डीएसएल प्रदान कर सकता है। – Angew

+2

@ एंज्यू दिलचस्प अवधारणा; 'नाम-ऑपरेटर' चाल के लिंक के लिए धन्यवाद। मैंने वास्तव में पहले कभी ऐसा नहीं देखा है। –

10

नहीं, यह संभव नहीं है। प्रीप्रोसेसर स्तर पर भी आप उन पात्रों से सीमित हैं जो वैध प्रीप्रोसेसर टोकन और मैक्रो नाम बनाते हैं, और फिर भाषा व्याकरण भाषा में ऑपरेटरों के सेट को ठीक करता है।

+0

तत्काल उत्तर @ केरेक के लिए धन्यवाद। मुझे विश्वास था कि यह संभव नहीं था; वेब पर विषय के बारे में पर्याप्त जानकारी नहीं देखी थी। इसे साफ करने के लिए धन्यवाद। :-) –

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

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