【问题标题】:Can std::function have a function pointer as the type?std::function 可以将函数指针作为类型吗?
【发布时间】:2021-12-04 18:24:24
【问题描述】:

假设我有 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()";
    }
};

【问题讨论】:

  • 我建议你看看标准库如何处理可调用对象:使用模板。使用模板,您几乎可以传递任何可调用的内容,例如合适的 lambda 函数(我建议您使用)。

标签: c++ std-function


【解决方案1】:

您可以在callback 上使用std::remove_pointer。假设您的函数类型为T,而callback 的类型为T*std::remove_pointer_t&lt;T*&gt; 会给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&lt;void()&gt;

【讨论】:

  • 澄清一点:callback1callback2 在本例中是同一类型。
  • 是的,同一类型的两个别名。 @eerorika 将其编辑为答案。
【解决方案2】:

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

没有。类模板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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2011-06-13
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多