2013-12-17 6 views
6

मैं एक विधि के तर्क के रूप में std::function का उपयोग करना चाहता हूं और इसके डिफ़ॉल्ट मान को std::stoi के रूप में सेट करना चाहता हूं।std :: stoi के साथ विधि तर्क के रूप में std :: function को डिफ़ॉल्ट मान के रूप में कैसे बनाएं?

no viable conversion from '<overloaded function type>' to 'std::function<int (const std::string &, size_t *, int)>' 

मैं एक समर्पित विधि बनाने जोड़कर संकलन करने में कामयाब रहे:

void test(std::function<int(const std::string& str, size_t *pos , int base)> inFunc=std::stoi) 

दुर्भाग्य से मैं निम्नलिखित त्रुटि मिलती है:

मैं निम्नलिखित कोड की कोशिश की।

#include <functional> 
#include <string> 


int my_stoi(const std::string& s) 
{ 
    return std::stoi(s); 
} 

void test(std::function<int(const std::string&)> inFunc=my_stoi); 

पहले संस्करण में क्या गलत है? क्या std::stoi का उपयोग डिफ़ॉल्ट मान के रूप में करना संभव नहीं है?

उत्तर

12

What's wrong in the first version?

stoi के दो भार के, string और wstring के लिए कर रहे हैं। दुर्भाग्यवश, फ़ंक्शन में पॉइंटर लेते समय उनके बीच अंतर करने का कोई सुविधाजनक तरीका नहीं है।

Isn't it possible to use std::stoi as default value?

आप अधिभार के प्रकार आप चाहते हैं डाली सकता है:

void test(std::function<int(const std::string&)> inFunc = 
    static_cast<int(*)(const std::string&,size_t*,int)>(std::stoi)); 

या आप एक लैम्ब्डा है, जो आपको क्या किया था के समान है लेकिन एक अवांछित समारोह परिचय नहीं है में लपेट कर सकता है नाम:

void test(std::function<int(const std::string&)> inFunc = 
    [](const std::string& s){return std::stoi(s);}); 
+0

यह 'typedf int (* fn) (const std :: string &, size_t *, int) पर शिकायत क्यों नहीं करता है; एफएन एफ = std :: stoi; '? –

+2

@ चार्ल्सफेह्लिवैनियन: क्योंकि केवल एक ओवरलोड उस फ़ंक्शन प्रकार में परिवर्तनीय है (यही कारण है कि मेरे उदाहरण में कास्ट काम करता है)। या तो 'std :: function' के टेम्पलेट कन्स्ट्रक्टर के लिए एक तर्क हो सकता है, और संकलक को यह देखने के लिए कि कौन सा वैध हो सकता है, दोनों टेम्पलेट विशेषज्ञता को तुरंत चालू करने की अनुमति नहीं है। –

+0

@ माइकसेमोर: स्पष्टीकरण के लिए धन्यवाद, मैं सोच रहा था कि ऐसा कुछ था लेकिन क्या पता नहीं लगा सका। –

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