2011-02-07 13 views
5

के साथ तर्क सूची अनपॅकिंग मैं एक पुराने सी-एपीआई के आसपास एक सी ++ सुविधा रैपर बनाने की कोशिश कर रहा हूं जो एक अपारदर्शी डेटा प्रकार का उपयोग करता है। एक विशेष सी-फ़ंक्शन है जो सी <stdarg.h> सुविधाओं का उपयोग करके तर्कों की परिवर्तनीय संख्या के साथ प्रारूप स्ट्रिंग लेता है। मेरे रैपर के हिस्से के रूप में, मैं इस फ़ंक्शन में मनमानी संख्याओं (सी ++ ऑब्जेक्ट्स सहित) को पारित करने में सक्षम होना चाहता हूं। हालांकि, चूंकि स्पष्ट रूप से <stdarg.h> सुविधाएं गैर-पीओडी डेटा के साथ काम नहीं कर सकती हैं, इसलिए मैंने एक टेम्पलेटेड रूपांतरण फ़ंक्शन बनाया जो सी ++ ऑब्जेक्ट्स (std::string) को पीओडी समकक्षों में परिवर्तित करता है।वैराडिक टेम्पलेट

मैंने सोचा कि यह पूरी बात सी ++ 0x वैरिएडिक टेम्पलेट्स का उपयोग करके एक आसान अभ्यास होगी, लेकिन मुझे इस फ़ंक्शन को इस तरीके से लिखने में कठिनाई हो रही है कि मेरे रूपांतरण फ़ंक्शन को लागू करते समय तर्क पैक को सही तरीके से अनलॉक किया जाए प्रत्येक तर्क।

क्या मैं अब तक है:

template <class T, class... Args> 
    void apply(OPAQUE* object, const char* fmt_string, T&& val, Args&&... args) 
    { 
     apply(object, fmt_string, Convert(val), args...); 
    } 

    template <class... Args> 
    void apply(OPAQUE* object, const char* fmt_string, Args&&... args) 
    { 
     C_API_Function_Call(object, fmt_string, args...); 
    } 
बेशक

, इस वजह से पुनरावर्ती क्रिया कॉल वास्तव में कभी Args... unpacks काम नहीं करता है, तो यह सिर्फ ढेर अतिप्रवाह जब तक recurses। मैं समझ नहीं कैसे यह तर्क खोल जबकि भीConvert कार्य करने के लिए वर्तमान तर्क गुजर, और फिर रिकर्सिवली परिणाम के साथ गुजर बनाने के लिए।

क्या ऐसा करने के लिए वैसे भी है?

उत्तर

25

मैं तुम्हें एक ही वाक्य रचना की जरूरत के रूप में जब आप सही अग्रेषण कर लगता है:

template <class... Args> 
void apply(OPAQUE* object, const char* fmt_string, Args&&... args) 
{ 
    C_API_Function_Call(object, fmt_string, Convert(std::forward<Arg>(args))...); 
} 

अंडाकार ... पर तर्क पैक युक्त एक अभिव्यक्ति के अधिकार पर रखा जा सकता है, और न केवल सीधे खुद तर्क पैक का अधिकार।

तो,:
समारोह (args ...) समारोह का विस्तार (ARG1, ARG2, arg3, [...], argN)
समारोह (args) ... समारोह का विस्तार (ARG1), समारोह (aRG2), [...], समारोह (argN)

नहीं
+2

यकीन है कि क्यों ओपी अभी तक अपनी राय नहीं बदली है और इस सवाल का जवाब स्वीकार कर लिया है। वर्तमान में स्वीकृत एक स्पष्ट रूप से गलत है, और आपका सही है। +1 चीयर्स। –

-1

इस समय सी ++ 0 एक्स ड्राफ्ट उस के लिए कोई समाधान प्रदान नहीं करता है। चूंकि समस्या tuples का विस्तार करने के समान है, तो आप this discussion पढ़ सकते हैं और समान विस्तार फ़ंक्शन लिख सकते हैं।

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