gpt4 book ai didi

c++ - 如何: variadic wrapper function that catches exceptions of input function

转载 作者:太空狗 更新时间:2023-10-29 20:03:55 26 4
gpt4 key购买 nike

我正在尝试创建一个可以传递给其他函数的函数,它会捕获任何错误,否则只会返回函数的返回值。这是我尝试过的:

#include <iostream>
using namespace std;

int fun(int input)
{
return input;
}

template <typename F, typename...Args>
static auto HandledCall(const F& function, Args...args)
-> decltype(function(...args))
{
try
{
return function(...args);
}
catch(...)
{
return NULL;
}
}

int main() {
std::cout << HandledCall(fun,1) << std::endl; // this should return 1
std::cout << HandledCall(fun,-1) << std::endl; // this should return 0
return 0;
}

希望意图比较明确;我希望 HandledCall 能够接收任何类型的函数,并返回其返回值(只要 NULL 在发生错误时隐式转换为该值) .但是,当我尝试编译上面的代码时,出现了这些错误;

prog.cpp:10:78: error: expected primary-expression before ‘...’ token static auto HandledCall(const F& function, Args...args) -> decltype(function(...args))

很明显,我没有正确地执行可变参数模板……有什么建议吗?

最佳答案

可以使用 std::result_of 确定函数调用的返回类型.

template<typename F, typename... Args>
typename std::result_of<F(Args...)>::type
HandledCall(F&& func, Args&&... args)
{
using result_type = typename std::result_of<F(Args...)>::type;
try {
return std::forward<F>(func)(std::forward<Args>(args)...);
} catch(...) {
return result_type();
}
}

Live demo

关于c++ - 如何: variadic wrapper function that catches exceptions of input function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24276834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com