【发布时间】:2014-12-29 18:11:34
【问题描述】:
我正在尝试构建一个将异常转换为可选的通用函数:
template<typename Func, typename... Args>
auto get_opt(Func f, Args&&... args)
{
auto ret = std::experimental::optional<decltype(f(std::forward<Args>(args)...))>();
try
{
ret = f(std::forward<Args>(args)...);
}
catch(const std::exception&)
{}
return ret;
}
然后我可以将它与任何可能引发异常的函数一起使用,并且它适用于没有重载的函数:
int test(const std::string& s)
{
return std::stoi(s);
}
int main(int argc, char** argv)
{
auto n = get_opt(test, "1234");
if(n)
{
std::cout << "value: " << *n << std::endl;
}
}
问题是如果我使用具有重载的函数,编译器会抱怨他不知道要调用什么重载:
auto n = get_opt(std::to_string, 1234);
main.cpp:25: error: no matching function for call to 'get_opt(<unresolved overloaded function type>, int)'
这个应该调用std::to_string(int)重载。
我的
get_opt函数格式正确吗?是args的通用参考并使用std::forward来处理这种情况吗?既然传递了参数
int,为什么编译器看不到要调用的重载,他应该正确计算出正确的重载?如何使其适用于重载?
提前致谢。
【问题讨论】: