c++ - (C++新手)保存一个函数指针,以后可以调用

标签 c++ templates

我花了一些时间来弄清楚如何做到这一点,但我认为我需要帮助。如果我可以使用模板,我就可以避免键入函数,例如“B::theFuncToBeCalled”,对吧?但如果我没记错的话,那只有在它是静态方法时才有效?

// A.h
typedef std::function <void()> CbType;

class A
{
    template<typename T>
        void setCallback(T &cb);

    private:
        template <typename T>
        T callThisLater;
};

// A.cpp
template<typename T>
void A::setCallback(T &cb)
{
    this->callThisLater = cb;

    // later...

   ((CbType*)callThisLater)();
}

// B.cpp
// in constructor or wherever
{
    A* a;
    a->setCallback(this->theFuncToBeCalled);

    // or, anonymous
    CbType func = [this](){
        // do something
        // call theFuncToBeCalled() if I feel like it :)
    };

    a->setCallback(func);
}

void B::theFuncToBeCalled()
{
    log("yay");
}

(如果我尝试以匿名方式执行此操作,我会收到访问冲突错误。)

最佳答案

这里有很多错误。让我们讨论一下,然后讨论如何解决它:

  1. 您不能简单地在实现文件中定义模板化函数:https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl
  2. variable templates仅适用于静态变量:

A variable template defines a family of variables or static data members

  1. 您正在传递一个方法,并试图像传递一个函数一样使用它,methods implicitly take the this parameter
  2. 一旦 callThisLater 的类型被定义为接受一个方法,它就不能随后更改为接受具有不同签名的 lambda
  3. A 类 是对可以用仿函数甚至函数指针解决的问题的糟糕重新实现

请简单地删除 class A 并使用函数指针和闭包类型:

auto a = &B::theFuncToBeCalled;
auto func = [=]() { (*this.*a)(); }

与其使用a,不如简单地使用func

关于c++ - (C++新手)保存一个函数指针,以后可以调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48621970/

相关文章:

javascript - 多行下划线模板和 _.each

c++ - 如何将编辑文本值传递给函数

c++ - 为什么编译器在下面的例子中没有选择我的函数模板重载?

c++ - 编译器是否优化了未使用的参数?

c++ - 如何获得专用模板以使用成员函数的非专用版本?

c++ - 如何结合就地转换和复制转换?

c++ - 'if' 与 C++ 中的模板

c++ - 使用正确的重载集调用多个函数的对象

c++ - 在 C++14 中将模板变量传递给模板函数

javascript - 我的 CSS 有什么问题?