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 ブロックを引数リストに入れることができるのかわかりませんか?
できません。foo2
の呼び出しから呼び出しをプル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
リテラルや式ではなく、常に関数をに渡す必要があります。
実行される前に例外がスローされないため、できませんfoo()
。
ほとんどの場合、@iagreen のソリューションを好みます。しかし、彼/彼女の解決策には、依存の問題があります:
foo
知る必要がありますか?foo2
もちろん、最初の電話でいくつかの結論を得ることができますfoo(foo2())
foo2
できる必要がありますfoo
foo2
の引数の量やその型を知る必要はなく、以前に呼び出された関数が何であったとしても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;
}