5

Qt5 がラムダ関数へのシグナルの接続をサポートするようになったので、ラムダを引数として別の関数に渡せるようにしたいと考えています。次のような関数があります。

void SomeFunc(Functor f)
{
    connect(obj, &MyObject::someSignal, f);
}

ただし、これを行うと、コンパイラは文句を言います。

"Functor" has not been declared

利回りFunctorへの変更:QtPrivate::Functor

QtPrivate::Functor is not a type

基本的に、私がやりたいことはQObject::connect、関数に取得する引数を渡すことだけです。どのタイプを使用する必要がありますか?

4

1 に答える 1

11

次の 2 つのオプションがあります。

template<typename Functor>
void SomeFunc(Functor f)
{
    connect(obj, &MyObject::someSignal, f);
}

また

void SomeFunc(std::function<void(/*ArgumentTypes...*/)> f)
{
    connect(obj, &MyObject::someSignal, f);
}

最初のオプションは任意の引数を に転送するだけconnectで、2 番目のオプションは C++11 標準ライブラリの多相関数ポインタを使用します。テンプレート引数は、シグナルの署名に対応している必要があります。Qt シグナルは無効です。 / ArgumentTypes... / は、関数の引数のリストに置き換える必要があります。したがって、シグナルが次のように宣言されている場合

void someSignal(int, QString);

関数は

std::function<void(int, QString)>
于 2013-02-05T08:37:46.643 に答える