【发布时间】:2022-01-04 04:18:04
【问题描述】:
我想写一个这样的回调
template<typename T>
T GetValue(T (*CallBack) (const string), string in)
{
T value;
try
{
value = CallBack(in);
}
catch(std::invalid_argument &e)///if no conversion could be performed
{
cout << "Error: invalid argument: --> " + string(e.what());
exit(-1);
}
return value;
}
int main()
{
int integer=0;
string data;
cin>>data;
integer=GetValue<int>(&std::stoi, data);
return 0;
}
但它不起作用。我有以下错误。
错误:无法转换“|未解析的重载函数类型|”到“int (^)(std::string)" {aka int (^)(std::__cxx11::basic_string)}
我也尝试了其他方法。像这样:
class Object;
typedef int (Object::*CallBack)(const string&, std::size_t*, int);
或者像这样:
typedef int (std::*FCAST)(const string&);
std::function<int(const string&)> f = (FCAST)&std::stoi;
错误:没有上下文类型的重载函数的地址 资讯|
但我没有成功。 ¿ 有人知道怎么做吗?
非常感谢!!
【问题讨论】:
-
std::stoi 不希望字符串作为按值调用传递,我猜。 en.cppreference.com/w/cpp/string/basic_string/stol。但当然,这似乎不是这个问题的根本原因。
-
是的,我也这么认为。非常感谢您的回复和链接
-
std::stoi有一个类型。不是int (*) (const string)。不是int (Object::*)(const string&, std::size_t*, int)。不是int(const string&)。只需使用正确的类型。 godbolt.org/z/Mvh4bqhxP 请注意,获取大多数标准库函数的地址是未定义的行为。 -
它有效。非常感谢。非常感谢。