0

私はプレーンな C スタティック ライブラリにこのコードを持っています:

extern "C" {
    typedef void (__cdecl* VisitChildren)(Option*);
    void __cdecl DoVisitChildren(Children* List, VisitChildren Visitor);
}

そして、ラムダを使用していくつかの C++ コード (単体テスト) から使用しようとしています。

...
DoVisitChildren(children, [&] (Option* option) {
...
});

コンパイラ エラーが発生しますC2664 ... cannot convert parameter 2 from 'unittests::UnitTest1::TestBuild::<lambda_b286d160b9bab3e09ab93cd59fc49f0b>' to 'VisitChildren'

キャプチャ '&' を削除すると、コンパイルして機能しますが、いくつかのビットとボブをキャプチャする必要があります。

これは可能ですか?

4

1 に答える 1

2

A closure created by a lambda expression can be implicitly converted to a function pointer, but only if it does not capture any variables. Also, it will be converted to a pointer to an extern "C++" function, not an extern "C" function, and technically those are incompatible types.

So no, you can't do this.

A hacky workaround is to store your actual closure in a global variable and pass a callback which invokes it. This will only work if your program is single-threaded and the DoVisitChildren call does not store the callback for later use.

std::function<void(Option*)> callback;
extern "C" void __cdecl invoke_callback(Option* o) { callback(o); }

// ...

callback = [&] (Option* option) { /* ... */ };
DoVisitChildren(children, invoke_callback);
于 2013-08-28T14:14:03.127 に答える