我需要一个帮助,将我的应用程序中的一个函数注册到一个类库中,以便以后可以在类库中使用它。这个函数是一个单人函数。
这就是我想发送它的方式。
extern "C" void __declspec(dllexport) RegisterFunctionsLib(const std::function<void(int, const std::string&)>& func_1, const std::function<void(const std::string&)>& func_2);
RegisterFunctionsLib(
CMySingletonClass::Instance().NameFunction, // not works
NormalFunction, // works
);
在我的lib项目中是这样的:
void RegisterFunctionsLib(const std::function<void(int, const std::string&)>& func_1, const std::function<void(const std::string&)>& func_2)
{
func_1(1, "func_1");
func_2("func_2");
}
func_2可以工作,因为是一个正常的函数,而不是单子和其他东西,但是来自单子类的函数,不能工作。
你需要将一个成员函数绑定到一个特定的实例上,你不能仅仅将一个成员函数当作一个普通的函数指针来传递,这两件事是完全不同的。一个成员函数实际上由两个东西组成--一个实例和一个函数。幸运的是,lambdas可以很好地解决这个特殊问题。
我没有测试这个问题,因为你的例子不完整,所以我不能编译它,但你可以做这样的事情。
extern "C" void __declspec(dllexport) RegisterFunctionsLib(const std::function<void(int, const std::string&)>& func_1, const std::function<void(const std::string&)>& func_2);
CMySingletonClass* psingleton_inst = CMySingletonClass::Instance();
RegisterFunctionsLib(
[psingleton_inst](int i, const std::string &str){psingleton_inst->NameFunction(i, str);}
NormalFunction, // works
);
你捕捉一个指向单人实例的指针 然后在你的lambda中直接调用实例函数 lambda 类型与 std::function 相匹配,因为它需要一个 int
和a const std::string &
. 假设 , 当然 , 你使用的是C++11或更高的版本