मैं refuting the notion के बाद धारा 13.5 पर विचार कर रहा था कि अंतर्निहित ऑपरेटरों अधिभार संकल्प में भाग नहीं लेते हैं, और ध्यान दिया कि operator->*
पर कोई अनुभाग नहीं है। यह सिर्फ एक सामान्य बाइनरी ऑपरेटर है।नि: शुल्क ऑपरेटर हैं -> * बुराई अधिभार?
इसके भाइयों, operator->
, operator*
, और operator[]
, सभी को गैर स्थैतिक सदस्य कार्य होने की आवश्यकता है। यह एक ऑब्जेक्ट से संदर्भ प्राप्त करने के लिए प्रयुक्त आमतौर पर पर एक फ्री फ़ंक्शन अधिभार की परिभाषा को रोकता है। लेकिन असामान्य operator->*
छोड़ा गया है।
विशेष रूप से, operator[]
में कई समानताएं हैं। यह द्विआधारी है (उन्हें एन-आरी बनाने के लिए एक सुनहरा मौका छूट गया), और यह बाईं ओर किसी प्रकार का कंटेनर स्वीकार करता है और दाईं ओर किसी प्रकार का लोकेटर स्वीकार करता है। इसका विशेष नियम खंड, 13.5.5, मुक्त कार्यों को छोड़कर किसी वास्तविक प्रभाव का प्रतीत नहीं होता है। (और है कि प्रतिबंध भी commutativity के लिए समर्थन का निवारण होता!)
तो, उदाहरण के लिए, इस perfectly legal है:
#include <utility>
#include <iostream>
using namespace std;
template< class T >
T &
operator->*(pair<T,T> &l, bool r)
{ return r? l.second : l.first; }
template< class T >
T & operator->*(bool l, pair<T,T> &r) { return r->*l; }
int main() {
pair<int, int> y(5, 6);
y->*(0) = 7;
y->*0->*y = 8; // evaluates to 7->*y = y.second
cerr << y.first << " " << y.second << endl;
}
इसे इस्तेमाल करता है खोजने के लिए आसान है, लेकिन वैकल्पिक वाक्य रचना है कि बुरा नहीं हो जाता है। उदाहरण के लिए, vector
के लिए अनुक्रमित बढ़ाया:
v->*matrix_width[2][5] = x; // ->* not hopelessly out of place
my_indexer<2> m(v, dim); // my_indexer being the type of (v->*width)
m[2][5] = x; // it is probably more practical to slice just once
मानक समिति इसे रोकने के लिए भूल गए, था यह बहुत परेशान करने के लिए बदसूरत माना जाता है, या वहाँ वास्तविक दुनिया उपयोग के मामलों रहे हैं?
एक डेटा बिंदु: Coneau (http://www.comeaucomputing.com/tryitout/) को खारिज कर दिया अपने कोड के बाद भी मैं 'को हटा दिया है' और पहली ऑपरेटर: 'त्रुटि: कोई ऑपरेटर" -> * "इन ऑपरेटरों से मेल खाता है –
sbi
@ एसबीआई: कॉमौ पहली जगह थी जहां मैं कोशिश करने और देखने के लिए गया था। मेरे पास अभी भी वह टैब खुल गया है ... जीसीसी 4.5 पर स्विच करने से पहले मैंने जो कोड डाला था वह" स्ट्रक्चर एक्स {इंट वाई;}; था int और ope rator -> * (x & l, int r) {वापसी l.y; } शून्य एफ() { x क्यू; int और i = q -> * 3; } "- और यह मुख्य उदाहरण के लिए सफलता देता है जो पहले टाइप_ट्रेट्स पर निर्भर करता है सब कुछ निर्भर करता है। – Potatoswatter
मुझे नहीं पता कि ऑपरेटर -> * को इस तरह अधिभारित क्यों किया जा सकता है, लेकिन यह निश्चित रूप से हेला बदसूरत दिखता है! मैं चाहता था कॉमा ओवरलोडिंग के समान कारण से दूर रहें - यह अंतर्ज्ञानी सी ++ की तरह दिखता नहीं है। – AshleysBrain