2

これはかなり珍しい問題ですが、それでも問題です。ラムダをパラメーターとして受け取り、それをに渡す関数がありますQObject::connect

template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, f);
    //...
}

の呼び出し例は次のMyClass::doSomethingようになります。

doSomething([]()
{
    // how do I get access to the sender???
});

私のコメントからわかるように、シグナルを発したQObject::senderへのポインターを取得するためにアクセスする方法はありません。QObjectシグナルを発行するクラスは、ラムダが作成されているスコープ内にないため、ラムダ内で参照する方法はありません。

どのようなオプションがありますか?


編集: Andy の提案 ( std::bind) を使用してみましたが、ほとんど理解できないテンプレート エラーの 1 つが発生します。

http://paste.ubuntu.com/1614425/

抜粋:

decltype はオーバーロードされた関数のアドレスを解決できません

...そしてそれは呼び出しを指していQObject::connectます。

4

1 に答える 1

6

私があなたの要件を正しく理解していれば、最初にラムダ ファンクターに適切な型の引数を受け入れさせることができます (ここでは参照渡しなので、寿命の問題に注意してください)。

doSomething([](QNetworkReply* p)
{
    // Here you have the sender referenced by p
});

次に、doSomething()テンプレート関数を使用std::bind()して、適切なオブジェクトを引数としてラムダが呼び出されるようにすることができます。

template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, bind(f, network_reply));
    //...
}
于 2013-02-05T22:09:22.657 に答える