std::function 可以有一个函数指针作为类型吗?

Can std::function have a function pointer as the type?

假设我有如下所示的 C 风格 callback 类型。对于 C++,我可以创建一个 std::function 类型,如 callback2,这种声明是我能找到的所有示例。但是我可以像下面的 callback3 一样重复使用 callback 而不是再次输入签名吗?

如果可以callback3

  1. 如何调用回调?像下面这样的 c.target<callback>(); 是调用回调的正确方法吗?

  2. 如何传递成员函数?对于普通类型,我可以使用 worker2([this]() {toBeCalled();});worker3([this]() {toBeCalled();}); 不起作用。

代码

typedef void (*callback)();
typedef std::function<void()> callback2;
typedef std::function<callback> callback3;

void worker(callback c)
{
    c();
}

void worker2(callback2 c)
{
    c();
}

void worker3(callback3 c)
{
    //Is this the way to call the callback?
    c.target<callback>();
}

class Caller
{
public: Caller()
    {
        //worker2([this]() {toBeCalled();});
        worker3(????);
    }
     void toBeCalled()
    {
         std::cout << "toBeCalled()";
    }
};

Can std::function have a function pointer as the type?

没有。 class 模板 std::function 仅为函数类型模板参数定义。对于所有其他参数类型,包括函数指针,模板未定义。

我还建议不要在一般情况下使用别名指针类型(尽管这个经验法则有例外)。如果你避免它,那么你可以重新使用别名就好了:

typedef void callback();
typedef std::function<callback> callback2;
// or preferably using the modern syntax
using callback  = void();
using callback2 = std::function<callback>;

void worker (callback* c);
void worker2(callback2 c);

您可以在 callback 上使用 std::remove_pointer。假设您的函数类型是 T,而 callback 的类型是 T*std::remove_pointer_t<T*> 会给出 T。在你的情况下 Tvoid()T*void(*)().

typedef void(*callback)();
typedef std::function<void()> callback1;
typedef std::function<std::remove_pointer_t<callback>> callback2;

void worker(callback c){
    c();
}
void worker1(callback1 c){
    c();
}
void worker2(callback2 c){
    c();
}


int main()
{
    worker([]{std::cout << "callback\n";});
    worker1([]{std::cout << "callback1\n";});
    worker2([]{std::cout << "callback2\n";});
}
/*
Output
callback
callback1
callback2
*/

现在,callback1callback2 是同一类型的别名,即本例中的 std::function<void()>