将 std::function 绑定到 C++ 中的成员函数?
Binding a std::function to a member function in c++?
我正在使用 following function:
使用 Open3D 库
bool open3d::visualization::DrawGeometriesWithAnimationCallback
(
const std::vector< std::shared_ptr< const geometry::Geometry >> & geometry_ptrs,
std::function< bool(Visualizer *)> callback_func,
const std::string & window_name = "Open3D",
int width = 640,
int height = 480,
int left = 50,
int top = 50
)
如果我从我的 main 调用这个函数并且在同一个 main.cpp
文件中有这个函数,我已经设法让它工作了。
但是,我想改为指向 class 成员函数。
这是我到目前为止得到的:
#include "WorkDispatcher.h"
int main(int argc, char* argv[])
{
// setup of the needed classes I want to point to
WorkDispatcher dispatcher;
dispatcher.Initialize();
dispatcher.m_MeshHandler.m_Mesh = open3d::geometry::TriangleMesh::CreateBox();
dispatcher.Work();
// here is the described issue
std::function<bool(open3d::visualization::Visualizer*)> f = std::bind(&MeshHandler::UpdateMesh, dispatcher.m_MeshHandler);
open3d::visualization::DrawGeometriesWithAnimationCallback({ dispatcher.m_MeshHandler.m_Mesh }, f, "Edit Mesh", 1600, 900);
dispatcher.Stop();
return 0;
}
这是从 this post 派生的,但给我以下错误:
no suitable user-defined conversion from "std::_Binder<std::_Unforced, bool (MeshHandler::*)(open3d::visualization::Visualizer *vis), MeshHandler &>" to "std::function<bool (open3d::visualization::Visualizer *)>" exists
我不太确定如何解决这个问题。在 MeshHandler::UpdateMesh()
函数中,我想访问 class 实例的其他成员。
原来您需要在 std::bind
函数中使用 std::placeholders
。
以下代码有效:
std::function<bool(open3d::visualization::Visualizer*)> f = std::bind(&MeshHandler::UpdateMesh, dispatcher.m_MeshHandler, std::placeholders::_1);
open3d::visualization::DrawGeometriesWithAnimationCallback({ dispatcher.m_MeshHandler.m_Mesh }, f, "Edit Mesh", 1600, 900);
有关详细信息,请参阅 std::bind
文档。
我正在使用 following function:
使用 Open3D 库bool open3d::visualization::DrawGeometriesWithAnimationCallback
(
const std::vector< std::shared_ptr< const geometry::Geometry >> & geometry_ptrs,
std::function< bool(Visualizer *)> callback_func,
const std::string & window_name = "Open3D",
int width = 640,
int height = 480,
int left = 50,
int top = 50
)
如果我从我的 main 调用这个函数并且在同一个 main.cpp
文件中有这个函数,我已经设法让它工作了。
但是,我想改为指向 class 成员函数。
这是我到目前为止得到的:
#include "WorkDispatcher.h"
int main(int argc, char* argv[])
{
// setup of the needed classes I want to point to
WorkDispatcher dispatcher;
dispatcher.Initialize();
dispatcher.m_MeshHandler.m_Mesh = open3d::geometry::TriangleMesh::CreateBox();
dispatcher.Work();
// here is the described issue
std::function<bool(open3d::visualization::Visualizer*)> f = std::bind(&MeshHandler::UpdateMesh, dispatcher.m_MeshHandler);
open3d::visualization::DrawGeometriesWithAnimationCallback({ dispatcher.m_MeshHandler.m_Mesh }, f, "Edit Mesh", 1600, 900);
dispatcher.Stop();
return 0;
}
这是从 this post 派生的,但给我以下错误:
no suitable user-defined conversion from "std::_Binder<std::_Unforced, bool (MeshHandler::*)(open3d::visualization::Visualizer *vis), MeshHandler &>" to "std::function<bool (open3d::visualization::Visualizer *)>" exists
我不太确定如何解决这个问题。在 MeshHandler::UpdateMesh()
函数中,我想访问 class 实例的其他成员。
原来您需要在 std::bind
函数中使用 std::placeholders
。
以下代码有效:
std::function<bool(open3d::visualization::Visualizer*)> f = std::bind(&MeshHandler::UpdateMesh, dispatcher.m_MeshHandler, std::placeholders::_1);
open3d::visualization::DrawGeometriesWithAnimationCallback({ dispatcher.m_MeshHandler.m_Mesh }, f, "Edit Mesh", 1600, 900);
有关详细信息,请参阅 std::bind
文档。