2009-07-12 16 views
31

सी ++ में, क्या आपके पास कक्षा में एक टेम्पलेट ऑपरेटर हो सकता है? इसलिए जैसा:,ऑपरेटर के साथ फ़ंक्शन टेम्पलेट

MyClass c; 
int i = c<int>(); // This doesn't work 
int i = (int)c(); // Neither does this* 

तथ्य यह है कि यह सब पर संकलित मेरे लिए पता चलता है कि यह संभव है:

class MyClass { 
public: 
    template<class T> 
    T operator()() { /* return some T */ }; 
} 

यह वास्तव में ठीक संकलित करने के लिए लगता है, लेकिन भ्रम कैसे भी इसे प्रयोग करेंगे में आता है मैं इसका उपयोग कैसे कर सकता हूं इसके लिए एक नुकसान में हूं! कोई सुझाव, या गैर स्टार्टर का उपयोग करने की यह विधि है?

+1

इसका क्या अर्थ है "यह काम नहीं करता/न ही यह करता है"? क्या होता है? –

+0

आप पर कंपाइलर बार्फ़, यही होता है :) – Toji

+0

मैं कसम खाता हूं कि मैंने पहले इस सवाल को पहले देखा है ... मुझे यह नहीं मिल रहा है, इसलिए स्पष्ट रूप से कोई आपको दोष नहीं दे सकता है। – GManNickG

उत्तर

41

आपको T निर्दिष्ट करने की आवश्यकता है।

int i = c.operator()<int>(); 

दुर्भाग्य से, आप इस मामले में सीधे फ़ंक्शन कॉल सिंटैक्स का उपयोग नहीं कर सकते हैं।

संपादित करें: ओह, और आप कक्षा परिभाषा की शुरुआत में public: खो रहे हैं।

+1

अच्छा।त्वरित और सटीक उत्तर पर कुडोस! दुर्भाग्य से यह शायद मेरे उपयोगों के लिए वर्बोज़ है (क्योंकि मेरा कोड दूसरों द्वारा बुलाया जाने वाला है, मैं भ्रम से बचना चाहता हूं) इसलिए मुझे बस एक और रास्ता खोजना होगा। एक बार फिर धन्यवाद! – Toji

+5

हां, आप शायद ऑपरेटर() 'के बजाय 'get' विधि को परिभाषित करने से बेहतर हैं। फिर आप 'c.get ()' लिख सकते हैं। – avakar

+0

दरअसल, कई लोगों द्वारा उपयोग की जाने वाली एक मुहावरे उड़ती है: नि: शुल्क कार्य (ट्यूपल्स का उपयोग करें ' (some_tuple)', boost.variant ' (some_variant) प्राप्त करें') का उपयोग करता है। तो आपका ''MyClass''es नेमस्पेस' में परिभाषित होने के साथ ' (सी)' प्राप्त होगा। –

18

आप मूल रूप से सही हैं। टेम्पलेट ऑपरेटर को परिभाषित करना कानूनी है, लेकिन उन्हें स्पष्ट टेम्पलेट तर्कों के साथ सीधे नहीं कहा जा सकता है।

आप इस ऑपरेटर हों:

template <typename T> 
T operator()(); 
अपने उदाहरण के रूप में

, यह केवल इस तरह कहा जा सकता है:

int i = c.operator()<int>(); 
बेशक

, यदि टेम्पलेट तर्क तर्क से निष्कर्ष निकाला जा सकता है , आप अभी भी इसे सामान्य तरीके से कॉल कर सकते हैं:

template <typename T> 
T operator()(T value); 

c(42); // would call operator()<int> 

एक विकल्प आरआर बनाने के लिए किया जा सकता है एक संदर्भ gument, और वहाँ उत्पादन की दुकान, बजाय इसे लौटने की:

template <typename T> 
void operator()(T& value); 

बजाय इस की:

int r = c.operator()<int>(); 

आप

int r; 
c(r); 

कर सकता है या शायद आप परिभाषित करना चाहिए ऑपरेटर का उपयोग करने के बजाय एक साधारण get<T>() फ़ंक्शन।

4

आप

class Foo { 
    public: 
    template<typename T> 
    operator T() const { return T(42); } 
}; 

Foo foo; 

int i = (int) foo; // less evil: static_cast<int>(foo); 

live example के बारे में सोच नहीं कर रहे हैं। यह साबित करता है कि स्वीकृत उत्तर में दावा के बावजूद आपको टेम्पलेट तर्क निर्दिष्ट करने की आवश्यकता नहीं है।

+0

इस मामले में काम करता है, लेकिन मैं 'सी ++' के बारे में सोच रहा था। मेरा मतलब है कि यह काम नहीं करना चाहिए, और मैं थोड़ी अपमानजनक नोटेशन हूं ... – kim366

+0

@ किम 366: चूंकि इसका कोई मतलब नहीं है, इसके बारे में सोचने के बजाय यह व्यर्थ है। यह काम नहीं करना चाहिए, और यह काम नहीं करता है। – MSalters

+0

हां, मुझे इसके बारे में पता है .. अच्छा लगता है, यद्यपि: पी – kim366

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