2013-03-04 16 views
8

उत्तीर्ण करने की स्थिति मैं एक ऐसा फ़ंक्शन बनाना चाहता हूं जो टेम्पलेट तर्कों की एक चर संख्या लेता है। बाद में इन तर्कों के साथ समारोह को अपनी स्थिति को इस तरह से पारित करना चाहिए:विविधता टेम्पलेट तर्क

template<typename R, typename Args...> 
R myFunction(Data &data, void *function) { 
    auto f = (R (*)(Args...))function; 
    return f(read<Args1>(data, 1), read<Args2>(data, 2), ...);// <-- This is the problem 
} 

दिया गया कोड निश्चित रूप से संकलित नहीं है। इसे ठीक करने का कोई तरीका है? बिना कोड कोड डुप्लिकेशंस के भिन्नता वाले टेम्पलेट्स के बिना ऐसा करने का कोई तरीका है?

+2

मुझे यकीन है कि आप ऑब्जेक्ट-पॉइंटर से फ़ंक्शन-पॉइंटर कास्ट से बच सकते हैं। – sellibitze

+0

@ सेलिबिटज़: क्या यह एक समस्या है? क्योंकि मेरे पास केवल एक शून्य * सूचक उपयोगकर्ता डेटा हो सकता है जो एक सी फ़ंक्शन से पारित किया जाता है। –

+0

डेटा 'शून्य *' हो सकता है। यह कार्य 'शून्य *' है जो एक चिंता है। –

उत्तर

14

हां, यह संभव है:

// we need a compile-time helper to generate indices 
template< std::size_t... Ns > 
struct indices 
{ 
    typedef indices< Ns..., sizeof...(Ns) > next; 
}; 

template< std::size_t N > 
struct make_indices 
{ 
    typedef typename make_indices< N - 1 >::type::next type; 
}; 

template<> 
struct make_indices<0> 
{ 
    typedef indices<> type; 
}; 

इन सहायकों के साथ, आप इस तरह अपने कार्य के लिए एक फारवर्डर की जरूरत है:

template<typename R, typename... Args, std::size_t... Ns> 
R myFunctionImpl(void *Data, void *function, indices<Ns...>) { 
    auto f = (R (*)(Args...))function; 
    return f(read<Args>(Data, Ns + 1)...);// +1 because indices is zero-based 
} 

template<typename R, typename... Args> 
R myFunction(void *Data, void *function) { 
    return myFunctionImpl< R, Args... >(Data, function, typename make_indices<sizeof...(Args)>::type()); 
} 

संपादित करें: यह कैसे काम करता है? सबसे पहले, हम argument packArgs के आकार sizeof... के आकार का निर्धारण करते हैं। make_indices<N>::type फिर indices<0,1,2,...,N-1> में फैलता है। इसे कार्यान्वयन फ़ंक्शन के लिए एक अतिरिक्त पैरामीटर के रूप में दिया जाता है (फॉरवर्डर जो सिर्फ डमी इंस्टेंस बनाता है), इसलिए तर्क कटौती कार्यान्वयन फ़ंक्शन की तरफ बढ़ती है और जेनरेटेड इंडेक्स को तर्क पैक Ns में डालती है।

कार्यान्वयन फ़ंक्शन में अब एक ही आकार के साथ दो तर्क पैक हैं, अर्थात् Args और Ns। जब इलिप्सिस ... के माध्यम से विस्तार किया गया, तो इलिप्सिस संपूर्ण अभिव्यक्ति फैलाता है कि यह लागू होता है और यह समांतर में सभी पैरामीटर पैक फैलाता है! उपर्युक्त उदाहरण में अभिव्यक्ति read<Args>(Data, Ns+1) है, जो अच्छी तरह से ओपीएस छद्म कोड में फैली हुई है।

+0

क्या आप एक साधारण उदाहरण पोस्ट कर सकते हैं? –

+2

मैंने अभी किया। मैंने जो उदाहरण दिया है उससे क्या गुम है? –

+0

क्या गुम है एक वास्तविक उदाहरण है। 'मुख्य()' और कुछ फ़ंक्शंस (1,2,3 पैरामीटर के साथ) के साथ। आप इन कार्यों और संरचनाओं का उपयोग कैसे करते हैं? –

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