2013-12-17 13 views
6

Bir yöntemin argümanı olarak bir std::function kullanmak ve varsayılan değerini std::stoi olarak ayarlamak istiyorum.std :: stoi varsayılan değer olarak std :: işlevi yöntem argümanı olarak nasıl oluşturulur?

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

Ben özel bir yöntem oluşturarak ekleyerek derlemek başardı:

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

Ne yazık aşağıdaki hatayı alıyorum:

Aşağıdaki kod çalıştı.

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

İlk sürümde sorun nedir? std::stoi varsayılan değeri olarak kullanılabilir mi?

cevap

12

What's wrong in the first version?

string ve wstring için stoi iki aşırı yükler vardır. Ne yazık ki, işlevin bir göstergesini alırken aralarında ayrım yapmak için uygun bir yol yoktur.

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

İstediğiniz aşırı türüne döküm olabilir:

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

veya ne yaptığını benzer ancak istenmeyen bir işlev tanıtmak olmayan bir lambda, bunu sarabilirdiniz ad:

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

Neden typedf int (* fn) (const std :: string &, size_t *, int); fn f = std :: stoi; '? –

+2

@CharlesPehlivanian: Sadece bir aşırı yük bu işlev tipine dönüştürülebildiğinden (bu, örneğin çalışmamdaki satırın neden işlediği). Ya std :: function 'şablon kurucusunun bir argümanı olabilir ve derleyicinin hangisinin geçerli olabileceğini görmek için şablon uzmanlıklarını başlatmasına izin verilmez. –

+0

@MikeSeymour: açıklama için teşekkürler, böyle bir şey olduğunu düşünüyordum ama ne olduğunu anlayamadım. –

İlgili konular