2
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 ブロックを引数リストに入れることができるのかわかりませんか?

4

3 に答える 3

2

できません。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リテラルや式ではなく、常に関数をに渡す必要があります。

于 2013-01-26T09:25:02.607 に答える
2

実行される前に例外がスローされないため、できませんfoo()

于 2013-01-26T09:04:48.293 に答える
1

ほとんどの場合、@iagreen のソリューションを好みます。しかし、彼/彼女の解決策には、依存の問題があります:

  • の署名をfoo知る必要がありますか?foo2

もちろん、最初の電話でいくつかの結論を得ることができますfoo(foo2())

  1. の戻り値はint に変換foo2できる必要があります
  2. foofoo2の引数の量やその型を知る必要はなく、以前に呼び出された関数が何であったとしても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;
}
于 2013-01-26T13:00:42.720 に答える