C++ 寄存器函数

问题描述 投票:1回答:1

我需要一个帮助,将我的应用程序中的一个函数注册到一个类库中,以便以后可以在类库中使用它。这个函数是一个单人函数。

这就是我想发送它的方式。

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可以工作,因为是一个正常的函数,而不是单子和其他东西,但是来自单子类的函数,不能工作。

c++ visual-studio dll
1个回答
1
投票

你需要将一个成员函数绑定到一个特定的实例上,你不能仅仅将一个成员函数当作一个普通的函数指针来传递,这两件事是完全不同的。一个成员函数实际上由两个东西组成--一个实例和一个函数。幸运的是,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或更高的版本

© www.soinside.com 2019 - 2024. All rights reserved.