无法调用 std::function

Cannot invoke std::function

本文关键字:function std 调用      更新时间:2023-10-16

这段代码在VS2015更新1中给我错误:

错误 C2893:无法专用化函数模板"未知类型 std::invoke(_Callable &&,_Types &&...)'

#include <iostream>
#include <functional>
using std::cout;
class A
{
public:
    virtual void init()
    {
        cout << "A";
    };
};

class B
{
public:
    virtual void init()
    {
        cout << "B";
    };
};
class C : private A, private B
{
    std::function<void()> a_init = &A::init;
    std::function<void()> b_init = &B::init;
public:
    void call()
    {
        a_init();
        b_init();
    }
};
int main()
{
    C c;
    c.call();
    return 0;
}

如果那是 VS 编译器有问题还是我的代码,有什么想法吗?
编辑

#include "stdafx.h"
#include <functional>
class A
{
public:
    virtual void inita()
    {
        cout << "A";
    };
};

class B
{
public:
    virtual void initb()
    {
        cout << "B";
    };
};
class C : private virtual A, private virtual B
{
    /*std::function<void()> a_init = &A::init;
    std::function<void()> b_init = &B::init;*/
public:
    void call()
    {
        inita();
    }
};

您正在尝试将非静态成员函数分配给不带参数的std::function。这是行不通的,因为非静态成员函数具有隐式this参数。

如何解决这个问题取决于你想做什么。如果要在调用时提供的任意对象上调用存储函数,则需要更改std::function签名:

std::function<void(A*)> a_init = &A::init;
void call()
{
  a_init(this); // or some other object of type A on which you want to invoke it
}

[现场示例]

另一方面,如果你想在没有参数的情况下调用它,你必须在初始化时将类型为 A 的对象绑定std::function中:

std::function<void()> a_init = std::bind(&A::init, this);
void call()
{
  a_init()
};

[现场示例]

将函数从 virtual 更改为 static,代码将起作用。您需要类的特定实例来调用非静态函数。

另一方面,如果您希望使用非静态函数,则可以添加以下构造函数:

C(A &a, B &b)
{
    a_init = std::bind(&A::init, &a);
    b_init = std::bind(&B::init, &b);
}

然后在 main 中使用它,如下所示:

A a;
B b;
C c(a, b);
c.call();

编辑:

如果公共继承是可接受的选项,那么您可以更简单地做到这一点。

构造 函数:

C()
{
    a_init = std::bind(&A::init, this);
    b_init = std::bind(&B::init, this);
}

用法:

C c;
c.call();