2016-06-06 3 views
8

हाल ही में मैं एक कष्टप्रद समस्या यह है कि मैं इस तरह के कार्यों को परिभाषित करना चाहते हों:केवल एक संदर्भ पैरामीटर के साथ परिवर्तनीय लंबाई पैरामीटर सूची का उपयोग कैसे करें?

std::string my_sprintf(const char* format, ...) 
{ 
    va_list args; 
    va_start(args, format); 
    ... 
} 
std::string my_sprintf(const std::string& format, ...) 
{ 
    va_list args; 
    va_start(args, format); // error 
    ... 
} 

लेकिन ऐसा लगता है संदर्भ मूल्य पिछले पैरामीटर जब चर लंबाई पैरामीटर सूची का उपयोग नहीं किया जा सकता।

क्या यह तरीका है कि मैं उपयोगकर्ता को स्ट्रिंग :: स्ट्रिंग प्रारूप स्ट्रिंग के रूप में उपयोग करने दे सकता हूं?

शायद कारक या कुछ और जो std :: स्ट्रिंग का पता लगाते हैं और इसे c_str() के रूप में परिवर्तित करते हैं, काम करेंगे, लेकिन मुझे नहीं पता कि निम्न चर लंबाई पैरामीटर सूची से कैसे निपटें।

संपादित करें: मैं वैरिएड टेम्पलेट का उपयोग नहीं कर रहा हूं क्योंकि मैं अंदर बनामप्रिंटफ का उपयोग कर रहा हूं। शायद vsprintf का उपयोग करने से बचें और std :: stringstream का उपयोग करना एक विकल्प है?

+1

[टैग: सी] नहीं है [टैग: सी ++]। –

+0

@iharob मेरा बुरा: पी –

+0

सी ++ तरीका 'printf' बनाने के लिए वैरिएड टेम्पलेट्स का उपयोग करना है [जैसे यहां] (http://stackoverflow.com/questions/17671772/c11-variadic-printf-performance) – justanothercoder

उत्तर

6

व्यवहार अपरिभाषित: सी ++ मानक 18.10/3 (सी ++ 11 और सी ++ 14 के लिए), या cppreference.com: Variadic Arguments देखें।

अनिवार्य रूप से आप केवल va_start के साथ सी में उपलब्ध प्रकारों का उपयोग कर सकते हैं, हालांकि std::nullptr_t प्रकार के लिए अपवाद बनाया गया है। const char* साथ संस्करण

template <typename ... Ts> 
std::string my_sprintf(const std::string& format, Ts&&...args) 
{ 
    return my_sprintf(format.c_str(), std::forward<Ts>(args)...); 
} 

और आप शायद भी variadic टेम्पलेट होना चाहिए, sprintf बजाय vsprintf का उपयोग करके:

+3

उन्हें ** पीओडी ** * सादा पुराना डेटा * भी कहा जाता है, [इसे पढ़ें] (http://stackoverflow.com/questions/146452/what-are-pod-types-in-c)। –

+0

मुझे पता है कि यह वर्जित है, लेकिन मैं बस इतना पूछ रहा हूं कि ऐसा करने का कोई तरीका है। –

+0

'va_start' के साथ नहीं, नहीं। लेकिन कोई कारण नहीं है कि आप variadic * टेम्पलेट्स * का उपयोग क्यों नहीं कर सके। या स्ट्रिंग की गहरी प्रतिलिपि बनाएँ। आपके फ़ंक्शन का I/O चरण गहरा प्रति नहीं, बाधा होगी। – Bathsheba

2

सी ++ में, जिस तरह से "अज्ञात" तर्क पारित करने के लिए है variadic टेम्पलेट का उपयोग करने के लिए।

+0

@ उपयोगकर्ता 2079303: हुह? वह 'const char *' अधिभार के लिए अग्रेषित कर रहा है ... – MFH

+0

@ user2079303: दोनों संस्करण विविधता के साथ, यह [डेमो] (http://coliru.stacked-crooked.com/a/649e95afbeee69b4) काम करता है। लेकिन वास्तव में, एलिप्सिस के साथ, यह संदिग्ध है और इसके लिए कुछ नाम बदलने की आवश्यकता है। – Jarod42

+0

@ जारोड 42 ओह, ठीक है। मैंने इस कोड को वैक्यूम में समझने की कोशिश की - यह महसूस किए बिना कि एक अधिभार है। शोर के बारे में खेद है। – user2079303

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