2010-03-07 21 views
7

क्या तर्क के ऑपरेटर कॉमा ओवरलोडिंग द्वारा फ़ंक्शन के लिए विविध तर्क बनाना संभव है? मैं एक उदाहरण देखना चाहता हूं कि ऐसा कैसे करें .. शायद कुछ ऐसा हो सकता है:सी ++ ओवरलैडिंग तर्कों के लिए ओवरलोडिंग ऑपरेटर कॉमा

template <typename T> class ArgList { 
public: 
    ArgList(const T& a); 
    ArgList<T>& operator,(const T& a,const T& b); 
} 
//declaration 
void myFunction(ArgList<int> list); 

//in use: 
myFunction(1,2,3,4); 

//or maybe: 
myFunction(ArgList<int>(1),2,3,4); 
+0

क्यों आप क्या करना चाहिए यह अल्पविराम ऑपरेटर का उपयोग कर? जैसे Boost.Assign पहले से ही आपको एक साफ वाक्यविन्यास देता है, लेकिन यह 'ऑपरेटर() 'का उपयोग करता है। –

+0

क्योंकि मैं माईफंक्शन (1,2,3) माईफंक्शन (बूस्ट :: list_of (1) (2) (3)) – uray

उत्तर

11

यह sort- है संभव है, लेकिन उपयोग बहुत अच्छा नहीं लगेगा। exxample के लिए:

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 

template <class T> 
class list_of 
{ 
    std::vector<T> data; 
public: 
    typedef typename std::vector<T>::const_iterator const_iterator; 
    const_iterator begin() const { return data.begin(); } 
    const_iterator end() const { return data.end(); } 

    list_of& operator, (const T& t) { 
     data.push_back(t); 
     return *this; 
    } 
}; 

void print(const list_of<int>& args) 
{ 
    std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

int main() 
{ 
    print((list_of<int>(), 1, 2, 3, 4, 5)); 
} 

यह कमी C++ 0x में तय हो जाएगा कि आप कहां कर सकते हैं:

void print(const std::initializer_list<int>& args) 
{ 
    std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

int main() 
{ 
    print({1, 2, 3, 4, 5}); 
} 

या यहाँ तक कि मिश्रित प्रकार के साथ:

template <class T> 
void print(const T& t) 
{ 
    std::cout << t; 
} 

template <class Arg1, class ...ArgN> 
void print(const Arg1& a1, const ArgN& ...an) 
{ 
    std::cout << a1 << ' '; 
    print(an...); 
} 


int main() 
{ 
    print(1, 2.4, 'u', "hello world"); 
} 
+0

यह अच्छा है, यह TR1 में है? – uray

+0

आरंभकर्ता_सूची? मुझे यकीन नहीं है क्योंकि इसे भाषा से काम करने के लिए अंतर्निहित समर्थन की आवश्यकता है। लेकिन दोनों स्निपेट पहले से ही जीसीसी 4.4.1 के साथ संकलित हैं std = C++ 0x – UncleBens

+0

क्या हमारे पास वैश्विक स्थैतिक ओवरलोडेड ऑपरेटर कॉमा जैसे हो सकता है: 'टेम्पलेट टी एंड ऑपरेटर, (कॉन्स टी एंड ए, टी & b);'? – uray

1

ऑपरेटरों के पास निश्चित संख्या में पैरामीटर हैं। आप इसे बदल नहीं सकते। अल्पविराम ऑपरेटर दो तर्क लेता है। तो नहीं। हालांकि, कुछ प्रयासों के साथ आप एक कस्टम, कैस्केडिंग संस्करण रोल कर सकते हैं।

+0

के रूप में उपयोग को सरल बनाना चाहता हूं, अल्पविराम ऑपरेटर एक तर्क लेता है। – StilesCrisis

+0

@StilesCrisis अल्पविराम ऑपरेटर वास्तव में एक या दो तर्क ले सकता है। दो तर्कों का उपयोग करके, आप निर्दिष्ट करते हैं कि कॉमा ऑपरेंड से पहले और किसी अन्य प्रकार के बाद दिखाई दे सकता है। यह नियमित एक-Arg अल्पविराम अधिभार से भी कम आम है, जो पहले से ही बहुत दुर्लभ है, लेकिन यह अस्तित्व में है। –

0

नहीं, ऐसा नहीं है। अल्पविराम ऑपरेटर द्वारा अलग मूल्यों की सूची का मूल्यांकन एक मूल्य के रूप में किया जाएगा। उदाहरण के लिए:

1,2,3 

एकल मान में परिणाम होगा, 3.

+2

जो मैं चाहता हूं, फ़ंक्शन अभी भी एकल मान प्राप्त करता है, लेकिन वह मान ऑपरेटर कॉमा द्वारा बनाया गया था, मुझे लगता है कि MyObject ऑब्जेक्ट = (1,2,3) करना संभव था, मैंने सोचा कि इसे संशोधित करना संभव था MyObject के साथ फ़ंक्शन तर्क – uray

+0

@uray क्षमा करें, यह पूरी तरह से अस्पष्ट है। Pleas अपने प्रश्न को संशोधित करने के लिए संशोधित करें कि आप क्या करना चाहते हैं। उदाहरण के लिए, आपके उदाहरण कोड में ए, बी, सी और डी के प्रकार क्या हैं? याद रखें, आप "अंतर्निर्मित" प्रकारों के लिए ऑपरेटरों को अधिभारित नहीं कर सकते हैं। –

+0

@neil: मैंने अपना प्रश्न – uray

1

हो सकता है कि कुछ इस तरह:

class MyArgList { 
public: 
    typedef std::list<boost::any> ManyList; 

    template <typename T> 
    MyArgList& operator, (const T& val) { 
     elems.push_back(val); 
     return *this; 
    } 

    ManyList::iterator begin() {return elems.begin();} 
     ... 

private: 
    ManyList elems; 
}; 

प्रयोग होगा:

void foo(MyArgList& list); 
foo((myArgList(),1,2,3,4,5));