2

EDIT3: 2 番目の createTriangle 関数を削除すると、機能します。では、オーバーロードされた関数をバインドするにはどうすればよいでしょうか?

次のように、1 つのパラメーターを持つ関数オブジェクトを受け取る関数があります。

int createObject(std::function<void(int)>);

std::bind でこの関数を呼び出すにはどうすればよいですか? 私はこのように試しました:

createObject(std::bind(&ClassA::createTriangle, std::placeholders::_1, a, b, c, color));

しかし、これは私にエラーを与えます:

候補テンプレートは無視されました: テンプレート引数を推測できませんでした

ClassA::createTriangle は静的関数です。


追加情報:

void ClassA::createTriangle(int id, const glm::vec3 & a, const glm::vec3 & b, const glm::vec3 & c, const glm::vec3 & col) {
    /* ... */
}

int ClassB::createTriangle(const glm::vec3 & a, const glm::vec3 & b, const glm::vec3 & c, const glm::vec3 & color) {
    return classCInstance.createObject(std::bind(&classA::createTriangle, std::placeholders::_1, a, b, c, color));
}

int ClassC::createObject(std::function<void(int)> f) {
    f(++id);
    return id;
}

ClassA には別の静的 createTriangle 関数があり、最後のパラメーターが異なります。それは多分問題ですか?bind はどの createTriangle を選択すればよいかわかりませんか? 次のようになります。

void ClassA::createTriangle(int id, const glm::vec3 & a, const glm::vec3 & b, const glm::vec3 & c, const std::initializer_list<glm::vec3> & colors) {
    /* ... */
}
4

1 に答える 1

7

ClassA::createTriangleオーバーロードされた関数であるため、使用するオーバーロードを指定せずに使用することはできません。std::bind汎用ラッパーを返す必要があり、それ自体では把握できないため、指定する必要があります。

これはうまくいくはずです:

void (*mySpecificCreateTriangle)(int, const const glm::vec3 &, const const glm::vec3 &, const const glm::vec3 &, const const glm::vec3 &) = &createTriangle;
createObject(std::bind(mySpecificCreateTriangle, std::placeholders::_1, a, b, c, color));

C++11 を使用しているため、ラムダを使用するとより満足できます。

createObject([=](int id){ return createTriangle(id, a, b, c, color); });
于 2014-03-09T17:02:18.487 に答える