3

任意の署名を持つstd::vectorを保持できる を作成することは可能ですか? std::function(関数の引数はすべて事前にバインドされます。)

std::vector<std::function<void()> >そのタイプのものが1つしかない場合は、std::function任意の関数をそれにバインドできるため、試しました。

これはベクトル内では機能しないようです:std::bind以外の署名を持つベクトルに関数を追加しようとすると、次のvoid()ようになります:

No matching member function for call to 'push_back'

これを行う方法はありますか?

編集:

引数が で事前にバインドされている限り、std::function<void()>返す関数をバインドできることを思い出しましたが、署名をバインドすることはできませんが、私の目的では十分に一般的であるため、次のように機能します。voidstd::bind

class A
{
public:
    void test(int _a){ return 0; };
};

A a;
std::vector<std::function<void()> > funcArray;
funcArray.push_back(std::bind(&A::test, std::ref(a), 0));
4

2 に答える 2

12

これは機能するはずです:

#include <iostream>
#include <functional>
#include <vector>

void hello() { std::cout << "Hello\n"; }
void hello2(const char * name) { std::cout << "Hello " << name << '\n'; }

int main()
{

    std::vector<std::function<void()>> v;
    v.push_back(hello);
    v.push_back(std::bind(hello2, "tim"));
    v[0]();
    v[1]();
}

お元気ですか?

于 2012-05-12T15:41:15.433 に答える
0

署名付きの std::function を保持できる std::vector を作成することは可能ですか? (関数の引数はすべて事前にバインドされます。)

では、ベクターを使用して異なる型のオブジェクトを保持できるかどうか疑問に思っていますが、それらをすべて 1 つの型にラップしたことはありませんか?

はい、すべて同じタイプのアイテムをベクトルに格納できます。


あるいは、「必要な型を持つように呼び出し可能なオブジェクトをラップするにはどうすればよいですか?」と尋ねようとしているのかもしれません。

bind は、一般的な型に変換可能なものを取得するためにパラメーターを削除または並べ替えるだけでよいという特殊なケースを処理できます。戻り値の型を選択したり、パラメーターを追加したりする必要がある一般的なケースを処理するには、単純に新しい関数を作成する必要があります。ラムダを使用すると、インラインで簡単に実行できます。

std::vector<std::function<common_signature> F;

double foo(std::string);
// for a common signature of void()
F.push_back([]{ foo("hello"); });

int bar(void);
// for a common signature of int (int)
F.push_back( [](int i) { return bar() + i; });

int baz(void);
// for a common signature of std::complex<double> (void)
F.push_back( []() -> std::complex<double> { return {0,baz()}; });
于 2012-05-12T17:16:45.857 に答える