2010-09-18 11 views
8

मैं एक चर तर्क तर्क सूची के साथ एक समारोह लिखना चाहता था। मैं अपने विकल्पों का पता लगाना चाहता हूं। मुझे पूरा यकीन है कि मैं इस उद्देश्य के लिए डिजाइन किए गए एक बूस्ट टेम्पलेट क्लास में आया हूं, लेकिन मैं इसका नाम नहीं सोच सकता? क्या कोई मुझे बता सकता है? या मैंने इसे सपना देखा! धन्यवादबूस्ट के साथ परिवर्तनीय तर्क सूचियां?

+0

आप चर तर्क गणना लेकिन एक प्रकार, या भी मनमाना प्रकार मतलब है? –

+0

मुझे यकीन नहीं है कि वास्तव में लाइब्रेरी क्या प्रदान की गई है, मैं इसे स्थानांतरित नहीं कर सकता, मुझे लगता है कि यह va_list पर कुछ प्रकार का सुधार था - संभवतः सुरक्षा – aukm

+0

टाइप करें क्या आपके फ़ंक्शन को केवल एक प्रकार के तर्क लेने की आवश्यकता है या नहीं? –

उत्तर

7

आप केवल एक ही प्रकार के तर्कों की एक चर गिनती स्वीकार करने के लिए एक कंटेनर ले जा रहा करने के लिए आम बात हो जाएगा की जरूरत है। कंटेनर तथापि ढील जा सकती है Boost.Assign का उपयोग करने का निर्माण:

void f(const std::vector<int>& vec) {} 
f(boost::assign::list_of(1)(2)(3)(4)); 

वैकल्पिक रूप से आप (operator() या operator<< के जैसे) अधिक भार खुद के ऑपरेटर के लिए जा सकते हैं, दृष्टिकोण मानक पुस्तकालय धाराओं द्वारा उठाए के समान:

op() << arg1 << arg2 << arg3; 

यदि आप वास्तव में एक प्रकार-सुरक्षित विविधता फ़ंक्शन प्रदान करना चाहते हैं (C++ 0x सुविधाओं का उपयोग किए बिना), Boost.Preprocessor सहायता कर सकता है। एक सामान्य उदाहरण:

#define OUT(z, n, name) << name ## n 

#define MAKE_FUNC(z, n, unused)          \ 
    template<class T BOOST_PP_ENUM_TRAILING_PARAMS(n, class T)>  \ 
    void func(T t BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(n, T, t)) { \ 
     std::cout << t BOOST_PP_REPEAT(n, OUT, t) << std::endl;  \ 
    } 

BOOST_PP_REPEAT(9, MAKE_FUNC, ~) // generates func() versions taking 1-10 arguments 
func(1, "ab", 'c'); // prints "1abc" 
संबंधित मुद्दे