Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用std::stoi作为默认值创建std::function作为方法参数?_C++_Function_C++11_Std - Fatal编程技术网

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:感谢您的解释,我认为有类似的情况,但无法弄清楚是什么。