5

渡された関数をtry-catch句内にラップしようとしています。これにより、スローされた例外をキャッチし、再スローする前にクリーンアップを実行できます。コンパイルのバグを再現するサンプルコードを作成しました。

#include <functional>
#include <iostream>
#include <queue>
#include <string.h>
#include <stdexcept>

using namespace std;

void foo(int a){
    throw runtime_error("died");
}

template<class F,class ...Args>
void gen(F&& f,Args&&... args){
    auto wrap = [](F f,Args... args){

        try{
            f(args...);
        }catch(exception& e){
            std::cout << "Caught exception" <<std::endl;
        }

    };

    auto bound = std::bind(wrap, std::forward<F> (f),
                           std::forward<Args>(args)...);

    bound();
}

int main()
{

    gen(foo,5);

    return 0;
}

ラムダ式またはバインド呼び出しのいずれかに関数ポインターを渡す方法がわからないようです。bound()の呼び出しでエラーが報告されているようです。誰かがアドバイスをしたり、私が誤解していることがあるかどうか教えてもらえますか?

4

1 に答える 1

1

あなたの問題は実際にはかなり単純です:のために推論されたタイプはF&&たまたまでvoid(int)はなくですvoid(*)(int)。ただし、関数ポインタをコピーできる間は関数をコピーできません。つまり、問題には1文字の修正があります。

gen(&foo, 5);

関数ではなく関数へのポインタを渡します。

于 2012-09-17T23:24:57.793 に答える