2015-04-29 16 views
6

मैं एक इनलाइन variadic समारोह
inline int foo(...)
मैं foo() जरूरत है एक मैक्रो कॉल करनी होगी, जो भी variadic है (यह MACRO कॉल)।
मूल रूप से मुझे अपने सभी इनपुट पैरामीटर MACRO पर पास करने के लिए foo() की आवश्यकता है। foo() को फिर से परिभाषित करना एक और मैक्रो __VA_ARGS__ विकल्प के कारण एक आसान समाधान होगा, लेकिन मुझे मूल्य वापस करने के लिए foo() की भी आवश्यकता है।
नोट: मैं पहले से लिखित कोड के दो हिस्सों को इंटरफेस करने की कोशिश कर रहा हूं और मुझे उन्हें बदलने की अनुमति नहीं है। कोड के पहले भाग में foo(...) का उपयोग किया जाता है और MACRO दूसरे भाग में परिभाषित किया गया है। केवल एक चीज जो मुझे करना है, foo() को परिभाषित करना है जो MACRO का उपयोग करता है और मैं नहीं कर सकता क्योंकि वे दोनों भिन्न हैं।variadic फ़ंक्शन को कॉल एक variadic मैक्रो

+0

क्या आप इलिप्सिस के बजाय 'foo' के लिए विविध टेम्पलेट का उपयोग कर सकते हैं? – Jarod42

+0

क्या आप varargs या variadic फ़ंक्शन टेम्पलेट्स के बारे में बात कर रहे हैं? एक के साथ आपकी समस्या हल हो सकती है, दूसरे के साथ यह नहीं कर सकता है। – Quentin

+4

नहीं किया जा सकता है। फ़ंक्शन पैरामीटर रन-टाइम पर सेट होते हैं, संकलन से पहले मैक्रोज़ का विस्तार किया जाता है। मैं इस गड़बड़ को फेंक दूंगा और जो भी करने की कोशिश कर रहा है उसे करने का एक समझदार तरीका समझूंगा। –

उत्तर

1

जो आप पूछ रहे हैं वह असंभव है।

एक चरम कार्य के तर्क रनटाइम पर निर्धारित किए जाते हैं, लेकिन एक मैक्रो संकलन समय पर फैलता है।

+1

असंभव? यह सी ++ है। – Yakk

+0

@Yakk यह __is__ असंभव है। फिर से अपना प्रश्न पढ़ें। 'foo' को एक मैक्रो नहीं, एक समारोह होना चाहिए। – orlp

+0

"क्योंकि 'foo' को एक मान वापस करना होगा।" हमें केवल एक मैक्रो है जो एक मूल्य देता है! मंगल सोलिस्टिस पर बलिदान 3 कुंवारी बकरियां और सुबह में मुझे बुलाओ। या, आप जानते हैं, सी ++ कोड के साथ घृणित बुलाओ। या तो काम करता है। – Yakk

6

foo एक मैक्रो बनाएं जिसमें एक लैम्बडा होता है जो मान देता है, और फिर उस लैम्ब्डा को आमंत्रित करता है।

#define foo(...) \ 
    [&](auto&&...args){ \ 
    /* do something with args, or __VA_ARGS__ */ \ 
    MACRO(__VA_ARGS__); \ 
    return 7; \ 
    }(__VA_ARGS__) 

अब int x = foo(a, b, c); दोनों foo अंदर लैम्ब्डा फोन करेगा, और कहा कि लैम्ब्डा के अंदर (a, b, c) पर मैक्रो कहते हैं, और एक मूल्य लौट सकते हैं।

मुझे दया है जो आपके कोड को आगे रखता है।

+3

बेहद आतंक से बाहर निकला। – Quentin

+0

ध्यान दें कि 'तर्क ...' और '__VA_ARGS__' 'foo (arg1, (अतिरिक्त, कोष्ठक, चारों ओर, अल्पविराम, ऑपरेटर, arg2)) के मामलों में भिन्न हो सकते हैं;' या सरल' foo (function_with_side_effect()) '। – Jarod42

+0

@ जारोड 42 हां! 'ऑटो और& .... args' और' (__VA_ARGS __) 'वैकल्पिक है, और अप्रत्याशित साइड इफेक्ट्स का कारण बन सकता है। फिर भी, यह आपको तर्कों के साथ-साथ टोकन के रूप में तर्क देता है, जो मुझे लगता है कि ओपी क्या चाहता था। – Yakk

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