आम तौर पर, कार्यों के साथ सी ++ 11 वैरिएडिक टेम्पलेट सुविधा का उपयोग करने के लिए फ़ंक्शन तर्क सूची में अंतिम होने के लिए विविधता-आधारित फ़ंक्शन तर्कों की आवश्यकता होती है। एक अपवाद है; यदि वे सी-स्तरीय विविधता तर्क हैं, तो वे अंतिम-अंतिम-अंतिम तर्क हैं, जो अंतिम रूप से मृत होना चाहिए।सी ++ और सी वैरिएडिक तर्कों का एक साथ उपयोग कैसे किया जा सकता है?
template < typename ...Args >
int super_printf(Something x, Args &&...a, ...);
मैं कभी कभी बेतरतीब ढंग से सी ++ के बारे में सोचते हैं, और मैं कैसे इस तरह के एक समारोह लागू किया जा सकता सोचा। मैंने पहली बार से तर्कों की सामान्य रिकर्सिव छीलने के बारे में सोचा, तो मुझे याद आया कि सी-स्तरीय varargs कैस्केड नहीं है। मुझे उन्हें तुरंत एक निश्चित va_list में बदलना है।
template < typename ...Args >
int super_vaprintf(Something x, std::va_list &aa, Args &&...a);
// Note that "aa" is passed by reference.
template < typename ...Args >
int super_printf(Something x, Args &&...a, ...)
{
std::va_list args2;
int result;
va_start(args2, XXX); // (A)
try {
result = super_vaprintf(x, args2, std::forward<Args>(a)...);
} catch (...) {
va_end(args2); // (1)
throw;
}
va_end(args2); // (2)
return result;
// Can (1) and (2) be compacted with RAII using a custom deleter lambda
// in std::unique_ptr or something? Remember that "va_end" is a macro!
}
सामान्य सी ++ variadic पुनरावर्ती छीलने super_vaprintf
कॉल में होता है। लाइन (ए) पर, XXX
, "ए" या "ए ..." के स्थान पर क्या होता है? क्या होता है यदि खाली है, तो x इसके बजाय वहां जाता है? यदि वह अंतिम प्रश्न सत्य है, तो क्या हम x पर कोई खराब नहीं हैं; कि भिन्नता के अलावा कोई तर्क नहीं है? (और अगर यह सच है, हम कैसे कोड अन्यथा एक्स जब एक खाली है, और एक उपयोग करने के लिए conditionalize है?)
...
मैं बस की मेरी नकल को देखा यहां किसी भी सहायता के लिए सी ++ 11 मानक। ऐसा कोई प्रतीत नहीं होता है। यह सी ++ कमेटी के लिए इसे ठीक करने के लिए वापस आने का अनुरोध करेगा, लेकिन मुझे यकीन नहीं है कि सी ++ varargs सबकुछ लेने के बिना ऐसा कोई फ़ंक्शन कहलाया जा सकता है। क्या मै गलत हु; सी ++ और सी varargs दोनों का उपयोग करने के लिए एक समारोह कॉल किया जा सकता है? या बेवकूफ (टेम्पलेट) इंस्टेंटेशन ट्रिक्स के संदर्भ में घोषणाओं के लिए केवल उपयोगी मिश्रण कर रहा है?
बस इसे पोस्ट करने के बाद, मुझे एहसास हुआ कि शायद "सुपर_प्रिंटफ (कुछ {}, 1, 2, 3, 4)" कुछ कुछ तर्कों को सी-लेवल ("3" और "4" इस मामले में)। –
CTMacUser
वे ऑर्थोगोनल हैं, क्योंकि सी वीए रन-टाइम पर काम करता है, और सी ++ वैरैडिक टेम्पलेट संकलन समय –
@CTMacUser पर काम करते हैं: हाँ, यह काम करेगा। सवाल अभी भी बना रहता है कि यह कैसे उपयोगी है, और मैं मेटाप्रोग्रामिंग में कहूंगा । हो सकता है कि आप विविध टेम्पलेट प्रस्तावों को पढ़ने में अधिक अंतर्दृष्टि पा सकें, वे बता सकते हैं कि यह क्यों संभव है। – PlasmaHH