2015-11-12 9 views
5

मैं आवरण कि टेम्पलेट समारोह N बार का आह्वान किया है:C++ 11 समारोह डिफ़ॉल्ट तर्क मान के साथ variadic आर्ग

template <std::uint16_t N, typename F, typename ... Args> 
inline typename std::result_of<F && (Args &&...)>::type retry_n(F && f, Args&& ... ax) 
{ 
    for (auto i = 0; i < N; ++i) 
    { 
     try 
     { 
      return std::forward<F>(f)(std::forward<Args>(ax)...); 
     } 
     catch (const some_except &e){ /*ignore exception for a while*/ } 
    } 
    throw;//re-raise 
} 

सब कुछ ठीक काम करता है जब तक मैं डिफ़ॉल्ट तर्क के साथ समारोह पारित:

int f(int a, int b, int c = 5); 
.... 
retry_n<10>(f, 1, 2); // error C2198: 'bla-bla' : too few arguments for call 

कैसे स्पष्ट तर्क के बिना डिफ़ॉल्ट तर्क का उपयोग करने के लिए?

+0

'retry_fn <10> ([] (ऑटो ... x) का उपयोग के साथ एक functor में, 1, 2) ' –

+0

@ ᐅ जोहान्सशैब-लिटब ᐊ हाँ यह स्पष्ट कार्यवाही – Dewfy

उत्तर

2

एक डिफ़ॉल्ट पैरामीटर फ़ंक्शन हस्ताक्षर का हिस्सा नहीं है, और टेम्पलेट प्रकार की कटौती में भाग नहीं लेता है। इसलिए जब भी आप f से retry_n<> पास करते हैं, तो F का प्रकार int(int, int, int) के रूप में घटाया जाता है, इसलिए स्थानीय f इस बाद के प्रकार का है, और डिफ़ॉल्ट पैरामीटर अब प्रक्रिया से बाहर हैं। आपका एकमात्र समाधान उस फ़ंक्शन का उपयोग करना है जिसे आप सीधे टाइप किए बिना परीक्षण करना चाहते हैं, जैसे @ जोहान्स शैब - लीटब की टिप्पणी में, या यदि आपका कंपाइलर जेनेरिक लैम्बडास (सी ++ 14) का समर्थन नहीं करता है, तो इसे लपेटें {वापसी f (x ...);} एक variadic टेम्पलेट operator()

struct functor 
{ 
    template<typename... T> 
    int operator()(T&&... params) 
    { 
     return f(std::forward<T>(params)...); 
    } 
}; 

और यह रूप में

retry_n<10>(functor{}, 1, 2); 
+0

तकनीकी रूप से सही उत्तर के लिए धन्यवाद। मैंने http://stackoverflow.com/a/27687037/149818 पर ध्यान दिया है और कुछ महसूस कर रहे हैं कि 'std :: enable_if_t' लागू किया जा सकता है – Dewfy

+0

@Dewfy Hmmm, हो सकता है, अगर आपको कोई जवाब मिल जाए तो कृपया उत्तर दें समाधान, समस्या दिलचस्प है। – vsoftco

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