【发布时间】:2017-01-06 13:12:07
【问题描述】:
我有一个名为 Renderer 的类,它包含两个回调对象;
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);
我想要一个绑定这些回调的公共函数,它是模板化的,需要一个有两个draw方法的类,每个方法都有它们的有效参数,如下所示:
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 中寻找答案,但有点令人生畏,感谢您的帮助!
更新:
好的,@Holt 给出的答案有效,更改为 std::function 后,我的回调如下所示:
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;
现在对于 setRenderer 方法,由于外部库的限制,我还需要像这样传递函数引用;
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? -
在我看来,您正试图将成员函数指针转换为不可能的函数指针。例如,请参阅stackoverflow.com/questions/4296281/…。
-
@Holt 它们是函数指针,但我正在考虑将它们设为 std::function 。我正在尝试你的答案。
-
@Holt 感谢您的回答,到目前为止它对我有所帮助,但请查看更新后的问题。再次感谢!
-
@Belfer4 你确定你有
drawCall = std::bind(drawCall, ...);吗?drawCall之一不应该以不同的方式命名吗?我真的不明白你想在这里做什么......
标签: c++ c++11 generics callback