2013-12-17 11 views
6

Vorrei utilizzare un std::function come argomento di un metodo e impostare il suo valore predefinito come std::stoi.Come creare una funzione std :: come argomento del metodo con std :: stoi come valore predefinito?

ho provato il seguente codice:

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

Purtroppo ho il seguente errore:

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

sono riuscito a compilare aggiungendo creando un metodo dedicato.

#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); 

Cosa c'è che non va nella prima versione? Non è possibile utilizzare std::stoi come valore predefinito?

risposta

12

What's wrong in the first version?

ci sono due overload di stoi, per string e wstring. Sfortunatamente, non c'è un modo conveniente per distinguere tra loro quando si prende un puntatore alla funzione.

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

Si potrebbe lanciare al tipo di sovraccarico che si desidera:

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

o si potrebbe avvolgerlo in un lambda, che è simile a quello che hai fatto, ma non introduce una funzione indesiderata nome:

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

Perché non si lamenta di 'typedf int (* fn) (const std :: string &, size_t *, int); fn f = std :: stoi; '? –

+2

@CharlesPehlivanian: Perché solo un overload è convertibile in quel tipo di funzione (motivo per cui il cast nel mio esempio funziona). O potrebbe essere un argomento per il costruttore di template di 'std :: function', e al compilatore non è consentito istanziare entrambe le specializzazioni di template per vedere quale potrebbe essere valida. –

+0

@ MikeSeymour: grazie per la spiegazione, stavo pensando che c'era qualcosa di simile ma non riuscivo a capire cosa. –

Problemi correlati