2010-09-17 16 views
15

क्या यह संभव है?ऑपरेटर टेम्पलेट पैरामीटर के रूप में

template<operator Op> int Calc(int a, b) 
{ return a Op b; } 

int main() 
{ cout << Calc<+>(5,3); } 

यदि नहीं, तो जिस तरह से भारतीय विदेश सेवा और स्विच के बिना इस लक्ष्य को हासिल करने के लिए किया जाता है?

+0

(एक int, ख) -> (एक int, int ख)। http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=141 – DumbCoder

उत्तर

16

आप इस के लिए functors इस्तेमाल कर सकते हैं:

template<typename Op> int Calc(int a, int b) 
{ 
    Op o; 
    return o(a, b); 
} 

Calc<std::plus<int>>(5, 3); 
+0

यह जाने का रास्ता होना चाहिए। बहुत बहुत धन्यवाद। – Xirdus

+3

@xir: ध्यान दें कि इसे टारियो तर्क जैसे टेम्पलेट तर्क के बजाय फ़ंक्शन तर्क के रूप में पास करने से उपयोगकर्ता को अधिक स्वतंत्रता मिलती है, उदा। राज्य के मज़दूरों को पारित करने के लिए, 'बाध्य()' अभिव्यक्तियों, ... –

+0

केवल 'वापसी ओप() (ए, बी) हो सकता है;' लेकिन जॉर्ज की तरह यह कहता है कि यदि आप इसे पैरामीटर के रूप में स्वीकार करते हैं तो यह अधिक लचीला है। – GManNickG

16

नहीं - टेम्पलेट्स के बारे में प्रकार या आदिम मूल्यों हैं।

फिर भी आप फ़ंक्शन ऑब्जेक्ट्स पास कर सकते हैं जिन्हें फ़ंक्शंस कहा जा सकता है और वांछित ऑपरेटर कार्यक्षमता (एक अच्छा वाक्यविन्यास होने के बावजूद) ले जाया जा सकता है।

मानक पुस्तकालय कई लोगों को, उदा परिभाषित करता है इसके अलावा के लिए std::plus ...

#include <functional> 

template<typename Op> 
int Calc(int a, int b, Op f) { 
    return f(a, b); 
} 

int main() { 
    cout << Calc(5,3, std::plus()); 
    cout << Calc(5,3, std::minus()); 
} 
2

आप इस बहुरूपता का उपयोग कर सकते हैं:

#include <cstdlib> 
#include <iostream> 
using namespace std; 


class Operator 
{ 
public: 
    virtual int operator()(int a, int b) const = 0; 
}; 

class Add : public Operator 
{ 
public: 
    int operator()(int a, int b) const 
    { 
     return a+b; 
    } 
}; 

class Sub : public Operator 
{ 
public: 
    int operator()(int a, int b) const 
    { 
     return a-b; 
    } 
}; 

class Mul : public Operator 
{ 
public: 
    int operator()(int a, int b) const 
    { 
     return a*b; 
    } 
}; 


int main() 
{ 
    Add adder; 
    cout << adder(1,2) << endl; 
    Sub suber; 
    cout << suber(1,2) << endl; 
    Mul muler; 
    cout << muler(1,2) << endl; 
    return 0; 
} 
+0

सही। लेकिन यह दिखाने के लिए वास्तव में उपयोगी है, आपको वास्तव में रनटाइम बहुरूपता का उपयोग करना होगा और 'ऑपरेटर और' इंटरफ़ेस का उपयोग करना होगा। उस मामले के लिए 'कैलक' लागू करें। फिर भी अग्रिम में +1! – Dario

0

आप वैश्विक ऑपरेटरों को देखें, तो आप पहले से ही कुछ जवाब प्राप्त हुआ है। कुछ विशेष मामलों में, हालांकि, अधिभारित ऑपरेटर फ़ंक्शंस का उपयोग करना भी उपयोगी हो सकता है।

यह मामूली हो सकता है;

#include <iostream> 

template<typename opType, typename T> 
int operation(opType op, T a, T b) 
{ 
    return (a.*op)(1) + (b.*op)(1); 
} 

struct linear 
{ 
    int operator()(int n) const {return n;} 
    int operator[](int n) const {return n * 10;} 
}; 

int main() 
{ 
    linear a, b; 

    std::cout << operation(&linear::operator(), a, b) << std::endl 
     << operation(&linear::operator[], a, b); 

    return 0; 
} 

उत्पादन: फिर भी यह है, जिसके कारण मैं एक उदाहरण पोस्ट कुछ मामलों में उपयोगी हो सकता है

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