Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 将异常转换为可选:无法解析重载函数类型_C++_Templates_Boost - Fatal编程技术网

C++ 将异常转换为可选:无法解析重载函数类型

C++ 将异常转换为可选:无法解析重载函数类型,c++,templates,boost,C++,Templates,Boost,我正在尝试构建一个将异常转换为可选的通用函数: 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(s

我正在尝试构建一个将异常转换为可选的通用函数:

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;
}
模板
自动获取选项(函数f、参数&…参数)
{
auto ret=std::实验::可选();
尝试
{
ret=f(标准:正向(参数)…);
}
捕获(const std::exception&)
{}
返回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;
    }
}
int测试(const std::string&s)
{
返回std::stoi(s);
}
int main(int argc,字符**argv)
{
自动n=获取选项(测试,“1234”);
如果(n)
{

std::cout这里的问题是模板类型推断,这是一个完美的转发失败。当您有一个重载函数时,应该为
Func
推断哪一个

有两种方法可以解决此问题。或者,创建一个正确类型的函数指针并将其传入,或者将
转换为\u string
转换为该类型:

using FuncType = std::string(*)(int );
FuncType f = std::to_string;

auto n = get_opt(f, 1234); 
auto n2 = get_opt(static_cast<FuncType>(std::to_string), 1234);
使用FuncType=std::string(*)(int);
FuncType f=std::to_字符串;
自动n=获取选项(f,1234);
auto n2=get_opt(静态_cast(std::to_string),1234);
我的
get_opt
函数是否格式正确?args的通用参考和使用
std::forward
是否是这种情况下的解决方法

为什么编译器看不到要调用什么重载呢?既然传递了参数int,他应该正确地计算重载

编译器不会检查函数调用以确定应选择哪个重载。事实上,当您有一个重载函数时,仅按其名称引用该函数会导致歧义,因为它可能有多个函数。它实际上是一个“未解析的重载函数类型”

通常,您可以通过强制转换为正确的类型来解决此问题,但是如果您的函数使用模板参数推断,您将无法在
get_opt
内的调用站点实现此目的。您可以使用lambda表达式来解决此问题:

auto glambda = [&] (auto&& x) { return std::to_string(x); });
auto n = get_opt(glambda, 1234);

非常感谢你的回答。它不能推导Func是非常有意义的,出于某种原因,我认为编译器可以使用Args来实现这一点,但显然他不能。cast可以工作,但我想让它更干净,我尝试了:模板自动获取_opt(Ret(*f)(Args…,Args&…Args),然后我会这样调用函数:auto n=get_opt(std::to_字符串,1234);但是我得到了完全相同的错误。但是现在他应该能够正确地推导出函数了吗?我给了他返回类型和参数类型。@sap同样的原因。
std::to_string
没有类型。No type==No type reduction,所以没有办法让它工作。非常感谢,我想没有其他方法了。现在我只需要一个通用的f为任何给定函数返回lambda的函数!哦,等等…@sap可以用宏来完成。
auto glambda = [&] (auto&& x) { return std::to_string(x); });
auto n = get_opt(glambda, 1234);