2011-12-25 8 views
12

एक समारोह मैं इस तरह के इनपुट और आउटपुट डेटा प्रकार घोषित करना चाहिए लेखन:क्या ऐसा फ़ंक्शन बनाना संभव है जो दिए गए तर्क के लिए एकाधिक डेटा प्रकार स्वीकार करेगा?

int my_function (int argument) {} 

यह इस तरह के एक घोषणा है कि मेरे समारोह प्रकार int के चर को स्वीकार करेंगे, bool या चार बनाने के लिए संभव है, और यह कर सकते हैं उत्पादन इन आंकड़ों प्रकार?

template <typename T> 
T my_function(T arg) { 
    // Do stuff 
} 

int a = my_function<int>(4); 

या सिर्फ अधिभार:

//non working example 
[int bool char] my_function ([int bool char] argument) {} 
+1

आप टेम्पलेट्स –

+4

में देखना यह कहा जाता है की जरूरत है [टेम्पलेट्स] (http: //www.iis .sinica.edu.tw/~ कैथी/vcstl/templates.htm) –

+0

@SergioTulentsev आपका लिंक 403 त्रुटि देता है – pkqxdd

उत्तर

19

आपके विकल्प हैं

,210

टेम्पलेट्स

template <typename T> 
T myfunction(T t) 
{ 
    return t + t; 
} 

वैकल्पिक 2

सादा समारोह ओवरलोडिंग

bool myfunction(bool b) 
{ 
} 

int myfunction(int i) 
{ 
} 

आप प्रत्येक तर्क के प्रत्येक प्रकार के लिए एक अलग समारोह प्रदान वैकल्पिक 1

आप उपयोग कर सकते हैं तुम आशा करते हो। आप इसे वैकल्पिक रूप से मिश्रित कर सकते हैं 1. कंपाइलर आपके लिए सही होगा।

वैकल्पिक 3

आप संघ

union myunion 
{ 
    int i; 
    char c; 
    bool b; 
}; 

myunion my_function(myunion u) 
{ 
} 

वैकल्पिक 4

आप बहुरूपता उपयोग कर सकते हैं का उपयोग कर सकते हैं। Int, char, bool के लिए एक ओवरकिल हो सकता है लेकिन अधिक जटिल वर्ग प्रकारों के लिए उपयोगी हो सकता है।

class BaseType 
{ 
public: 
    virtual BaseType* myfunction() = 0; 
    virtual ~BaseType() {} 
}; 

class IntType : public BaseType 
{ 
    int X; 
    BaseType* myfunction(); 
}; 

class BoolType : public BaseType 
{ 
    bool b; 
    BaseType* myfunction(); 
}; 

class CharType : public BaseType 
{ 
    char c; 
    BaseType* myfunction(); 
}; 

BaseType* myfunction(BaseType* b) 
{ 
    //will do the right thing based on the type of b 
    return b->myfunction(); 
} 
+1

बूस्ट :: कोई, शून्य *, और boost :: संस्करण क्यों नहीं जोड़ते?साथ ही साथ पूरा रास्ता भी हो सकता है। – Lalaland

+1

@EthanSteinberg कृपया उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें ... मैं आमतौर पर मानक सी ++ –

+0

पर चिपकना पसंद करता हूं, ओप तर्क के रूप में उसी प्रकार को वापस करने के लिए कहता है, हर बार 'int' नहीं' –

1

इस ट्यूटोरियल पढ़ें, यह कुछ अच्छा उदाहरण http://www.cplusplus.com/doc/tutorial/templates/

+2

हालांकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (// meta.stackoverflow.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। – CodeMouse92

2

उपयोग एक template देता

int my_function(int a) { ... } 
char my_function(char a) { ... } 
bool my_function(bool a) { ... } 
5
#include <iostream> 

template <typename T> 
T f(T arg) 
{ 
    return arg; 
} 

int main() 
{ 
    std::cout << f(33) << std::endl; 
    std::cout << f('a') << std::endl; 
    std::cout << f(true) << std::endl; 
} 

उत्पादन:

33 
a 
1 

या आप कर सकते हैं:

int i = f(33); 
char c = f('a'); 
bool b = f(true); 
+0

वाह कमाल है! टेम्पलेट कैसे काम करता है? – Rhexis

+0

@ रेक्सिस, इस मामले में यह 'टाइपनाम टी' के मूल्य का अनुमान लगाता है कि फ़ंक्शन 'f()' का तर्क किस प्रकार है –

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

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