当前位置: 首页 > 知识库问答 >
问题:

将C++方法作为函数指针传递

万俟心思
2023-03-14
    bool sendRequest(DataFieldList& requestParams,
                     DataFieldList& responseParams,
                     std::string context, void(*sendFailure)() = NULL);
    sendRequest(paramList, responseList, "Could not set background lighting control brightness limit", HBCMaxBrightnessLimitSendFailure);
    void HBCMaxBrightnessLimitSendFailure();

当我构建这个应用程序时,我得到错误:

    lightingsystemcomponent.cpp(969): error C3867: 'Lighting::SystemComponent_impl::HBCMaxBrightnessLimitSendFailure': function call missing argument list; use '&Lighting::SystemComponent_impl::HBCMaxBrightnessLimitSendFailure' to create a pointer to member

我也试过:

    sendRequest(paramList, responseList, "Could not set background lighting control brightness limit", HBCMaxBrightnessLimitSendFailure());

这将错误更改为:

    lightingsystemcomponent.cpp(969): error C2664: 'bool Lighting::SystemComponent_impl::sendRequest(DataFieldList &, DataFieldList &,std::string,void (__cdecl *)(void))' : cannot convert argument 4 from 'void' to 'void (__cdecl *)(void)'
    bool sendRequest(DataFieldList& requestParams,
                     DataFieldList& responseParams,
                     std::string context,
                     std::function<void()> sendFailure = NULL);
    void LightingEngine::sendRequest(DataFieldList& requestParams,
                                     DataFieldList& responseParams,
                                     std::string context,
                                     std::function<void()> sendFailure) {
    if ( sendFailure != NULL ) {
        sendFailure();
    }
    error C2064:  term does not evaluate to a function taking 0 arguments

下面是调用这个例程的类和我传递的回调函数的示例:

    void component::onFailure() {
        ...Do something...
    }

    void component::update() {
        ... Some set-up to build paramlist ...
        LightingEngine* engine = getLightingEngine();
        assert(engine != nullptr);
        engine->sendRequest(&paramList, &responseList, "Some context text", [this]()->void { onFailure(); });            
    }

共有1个答案

卫昊东
2023-03-14

可以将SendFailure声明为成员函数指针。

bool sendRequest(DataFieldList& requestParams,
                 DataFieldList& responseParams,
                 std::string context, 
                 void(Lighting::SystemComponent_impl::*sendFailure)() = nullptr);

这将允许您写一个非常长的行:

sendRequest(paramList, responseList, "Could not set background lighting control brightness limit", &Lighting::SystemComponent_impl::HBCMaxBrightnessLimitSendFailure);

另一种选择是使用std::function

bool sendRequest(DataFieldList& requestParams,
                 DataFieldList& responseParams,
                 std::string context, 
                 const std::function<void()> &sendFailure = nullptr);

并调用sendrequest,如下所示:

sendRequest(paramList, responseList, "Could not set background lighting control brightness limit", [this]{ HBCMaxBrightnessLimitSendFailure() });
template <typename Func>
bool sendRequest(DataFieldList& requestParams,
                 DataFieldList& responseParams,
                 std::string context, 
                 Func sendFailure);
bool sendRequest(DataFieldList& requestParams,
                 DataFieldList& responseParams,
                 std::string context);
sendRequest(paramList, responseList, "Could not set background lighting control brightness limit", [this]{ HBCMaxBrightnessLimitSendFailure() });
 类似资料:
  • 我创建了一个名为InputControl的类。我正在使用一个名为GLFW的库和一个函数glfwsetkeycallback。该函数定义为: E0167“void(inputcontrol::*)(GLFWwindow*window,int key,int scancode,int action,int mods)”类型的参数与“GLFWKeyFun”类型的参数不兼容

  • 我正在尝试编写一个类模板,在内部它使用一个函数(BFGS优化的实现,由环境提供),接口如下: 其中< code>fn和< code>gr是类型的函数指针 和 分别是。我的< code>C 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函

  • C++ 指针 C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {

  • 我的问题是,我想创建一个通用的命令行应用程序,可以用来加载一个库DLL,然后调用库DLL中的函数。函数名在命令行中指定,参数也在实用程序命令行中提供。 我可以使用函数从动态加载的DLL访问外部函数。加载库后,我可以使用获得指向函数的指针。我想用命令行上指定的参数调用函数。 我是否可以将空点指针列表传递给 函数返回的函数指针,类似于下面的示例? 为了保持示例代码简单,我删除了错误检查。有没有办法让这

  • 我有以下代码: 我正在尝试将char和char指针数组传递给函数,但上面的代码会导致以下错误和警告: 我正在努力理解问题是什么。

  • 问题内容: 我有以下功能: 其中,的类型是具有以下定义的接口: 题: 这是真的,和是 通过按引用 ,并且有它的价值被复制? 我认为: 是通过引用的,因为它是一张地图 是一个结构。因此,我应该传递指针以避免复制数据 问题答案: 接口类型只是一组方法。请注意,接口定义的成员未指定接收方类型是否为指针。这是因为 值类型的方法集是其关联的指针类型的方法集的子集 。满嘴 我的意思是,如果您具有以下条件: 然