2つのコールバックオブジェクトを保持するRendererというクラスがあります。引数を指定してジェネリックコールバックをバインドするC++ 11
void (*drawCall)(const sf::Drawable& drawable, const sf::RenderStates& states);
void (*drawPrimCall)(const sf::Vertex* vertices, unsigned int vertexCount,
sf::PrimitiveType type, const sf::RenderStates& states);
私は、これらのコールバックをバインドするパブリック関数を持っていると思います、それは、このような何かテンプレートですし、その有効なパラメータを持つ2つの描画メソッドそれぞれを持つクラスが必要です。しかし
template<typename T>
inline void setRenderer(T* instance)
{
using namespace std::placeholders;
drawCall = std::bind(&T::draw, instance, _1, _2);
drawPrimCall = std::bind(&T::draw, instance, _1, _2, _3, _4);
}
、あなたはこれがうまくいかないと想像するかもしれません。私はまだstd :: bindについて学習しています。プレースホルダの使用についてはわかりませんが、ここで何をしようとしているのか理解しています。
私はGoogleで回答を探してみましたが、少し難解でした。何か助けてくれてありがとうございました!
UPDATE:原因の制約にsetRenderer方法のための今すぐ
std::function<void(const sf::Drawable& drawable, const sf::RenderStates& states)> drawCall_fn;
std::function<void(const sf::Vertex* vertices, unsigned int vertexCount,
sf::PrimitiveType type, const sf::RenderStates& states)> drawPrimCall_fn;
:
[OK]を、@Holtによって与えられた答えは::をはstdする変更した後、働くためには、私のコールバックは次のようになり機能します外部ライブラリ私はまた関数参照を渡す必要があります。
template<typename T>
inline void setRenderer(T* instance, void(T::*drawCall)(const sf::Drawable&, const sf::RenderStates&))
{
using namespace std::placeholders;
drawCall_fn = std::bind(drawCall, instance, _1, _2);
}
呼び出されたとき、私はこのようにそれを行うことができますこのような:
renderer.setRenderer<sf::RenderTarget>(&window, &sf::RenderTarget::draw);
**注:私は簡単に後に展開することができますように私は一瞬だけdrawCall_fnを扱っています。
UPDATE2:setRenderer drawCallに欠落しているパラメータを追加しました。
'drawCall'と' drawPrimCall'の種類は何ですか? 'std :: function'ですか? – Holt
メンバー関数ポインタを不可能な関数ポインタに変換しようとしているようです。たとえば、http://stackoverflow.com/questions/4296281/how-can-i-pass-a-member-function-to-function-pointerを参照してください。 –
@Holt彼らは関数ポインタですが、私はそれらをstd :: functionにすることを検討していました。私はあなたの答えatmを試しています。 – Belfer4