void foo(int arg);
int foo2() {throw std::out_of_range("error!"); return 5;}
//Now I do this like that:
try { foo(foo2()); }
catch(std::out_of_range) {}
而我想要做的是在 foo 函数中捕获异常。但是我不知道如何将 try 块放入参数列表中?
你不能,因为在执行之前没有抛出异常foo()
。
你不能。您要么需要将调用拉出foo2
调用 to foo
,然后在调用例程中处理异常,因此 -
int param;
try {
param = foo2();
} catch(std::out_of_range) {}
foo(param);
或foo2
作为函数传递给foo
,并在内部对其进行评估foo
,如下所示 -
void foo(int (*arg_func)()) {
int arg;
try {
arg = arg_func();
} catch(std::out_of_range) {
std::cout << "out of range ";
}
}
然后调用看起来像这样——
foo(foo2);
当然,现在您总是必须将函数传递给foo
,而不是文字或表达式。
大多数时候,我更喜欢@iagreen 的解决方案。但在他/她的解决方案中,存在依赖问题:
foo
知道foo2
的签名吗?当然,我们可以在您最初的通话中得出一些结论foo(foo2())
foo2
应该可以转换为 intfoo
不需要知道foo2
's 参数的数量和它们的类型,甚至不需要知道之前调用的函数是什么foo
所以我认为Variadic Template的实现在大多数情况下更合适。
template < typename F, typename... Args >
void foo( F f, Args&&... args ) {
int ret = f( std::forward<Args>(args)... );
std::cout << "ret = " << ret << std::endl;
}