C++ 如何使用std::stoi作为默认值创建std::function作为方法参数?
我想使用C++ 如何使用std::stoi作为默认值创建std::function作为方法参数?,c++,function,c++11,std,C++,Function,C++11,Std,我想使用std::function作为方法的参数,并将其默认值设置为std::stoi 我尝试了以下代码: void test(std::function<int(const std::string& str, size_t *pos , int base)> inFunc=std::stoi) 无效测试(std::function inFunc=std::stoi) 不幸的是,我得到了以下错误: no viable conversion from '<overlo
std::function
作为方法的参数,并将其默认值设置为std::stoi
我尝试了以下代码:
void test(std::function<int(const std::string& str, size_t *pos , int base)> inFunc=std::stoi)
无效测试(std::function inFunc=std::stoi)
不幸的是,我得到了以下错误:
no viable conversion from '<overloaded function type>' to 'std::function<int (const std::string &, size_t *, int)>'
从“”到“std::function”没有可行的转换
我通过创建一个专用方法来编译
#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);
#包括
#包括
int my_stoi(const std::string&s)
{
返回std::stoi(s);
}
无效测试(标准::函数inFunc=my_stoi);
第一个版本出了什么问题?
是否可以使用std::stoi
作为默认值
第一个版本出了什么问题
有两个重载stoi
,分别用于string
和wstring
。不幸的是,在使用指向函数的指针时,没有方便的方法来区分它们
是否可以使用std::stoi作为默认值
您可以强制转换为所需的重载类型:
void test(std::function<int(const std::string&)> inFunc =
static_cast<int(*)(const std::string&,size_t*,int)>(std::stoi));
无效测试(标准::函数inFunc)=
静态(标准::stoi);
或者您可以将其包装在lambda中,这与您所做的类似,但不会引入不需要的函数名:
void test(std::function<int(const std::string&)> inFunc =
[](const std::string& s){return std::stoi(s);});
无效测试(标准::函数inFunc)=
[](const std::string&s){return std::stoi(s);});
为什么它不抱怨typedf int(*fn)(const std::string&,size\u t*,int);fn f=std::stoi
?@charlespehlivian:因为只有一个重载可以转换为该函数类型(这就是我的示例中的强制转换工作的原因)。任何一个都可能是std::function
的模板构造函数的参数,编译器不允许实例化这两个模板专门化以查看哪一个是有效的。@MikeSeymour:感谢您的解释,我认为有类似的情况,但无法弄清楚是什么。