gpt4 book ai didi

c++ - 你能解释一下下面多种操作数的混合吗? (C++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:49 24 4
gpt4 key购买 nike

我用工具查过别人的代码,说是这里有问题:

policyCallback = callback;

因为我是初学者,所以找不到问题。你能给我一个翻译的提示或指南吗?

完整代码如下。

std::function <void (std::vector<std::string> resources)> policyCallback;

namepace nsp {
class Manager {
public:
Manager(const std::string &str);
virtual ~Manager();

template <typename FuncType>
void registerPolicyActionCallback(FuncType callback) {
policyCallback = callback;
}
};
} //namespace nsp

namespace nsp{
class Manager;
}

class SomeAPIs {
public:
void policyActionCallback(std::vector<std::string> param);
};

int main() {
nsp::Manager *rManager;

rManager->registerPolicyActionCallback(std::bind(&SomeAPIs::policyActionCallback, this, std::placeholders::_1));
}

最佳答案

除了代码中的一些明显错误之外,阻止您实现所需目标的主要问题是您调用 std::bind 的方式。

首先,您的代码在 SomeAPIs 中将 policyActionCallback(/*...*/) 声明为私有(private)。现在,虽然您可以通过指向它的指针调用任何成员函数,无论它是公共(public)的、 protected 还是私有(private)的,但只有成员和 friend 可以创建指向私有(private)成员函数的指针。因此,除非您从 API 本身或 API 的 friend 调用 std:bind,否则您将只能绑定(bind)到 API 的公共(public)成员函数。为了演示一个可行的概念,我假设您要用于回调的函数都是 API 的公共(public)成员。

其次,要使用 std::bind 绑定(bind)成员函数,您需要提供对该函数(您所做的)的引用,以及对 的引用(或指针)成员所属类的实例,您尚未完成。

因此,由于您要绑定(bind)的函数是SomeAPIs 的成员,因此您需要提供对SomeAPIs 实例的引用。我假设您希望 this 成为指向 nsp::Manager 实例的指针,正如我刚刚解释的那样,它是提供引用的错误对象到。

此外,您对 this 关键字的使用不正确。取自 cppreference,this 可以出现在以下上下文中

  1. 在任何非静态成员函数的主体内,包括成员初始化列表
  2. 在一个非静态的声明中 在(可选的)cv 限定符序列之后的任何位置的成员函数, 包括动态异常规范(已弃用)、noexcept 规范(C++11),和尾随返回类型(C++11 起)
  3. 在默认成员初始化器中(C++11 起)

由于您对 this 的使用不符合上述任何一种情况,因此编译器给出:

error: invalid use of 'this' in non-member function

这是您想要实现的工作代码。请注意 std::bind 现在是如何使用的。 (我为 Manager 添加了一个构造函数,删除了虚拟析构函数,因为管理器没有任何虚函数,使 SomeAPIs 中的函数公开,以便 std::bind 可以接收指向它的指针,并删除现在在自由存储上声明的 nsp::Manager 指针):

#include <vector>
#include <iostream>
#include <functional>

std::function <void (std::vector<std::string> resources)> policyCallback;

namespace nsp {
class Manager {
public:
Manager() {};
Manager(const std::string &str) {}

// Don't know why this is virtual when this isn't a base class?
// virtual ~Manager();

template <typename FuncType>
void registerPolicyActionCallback(const FuncType callback) {
policyCallback = callback;
}
};
} //namespace nsp

class SomeAPIs {
public:
void policyActionCallback(std::vector<std::string> param) {
for (const auto& p : param) {
std::cout << "SomeAPIs : " << p << "\n";
}
}
};

// Another API for illustration
class SomeOtherAPI {
public:
void policyActionCallback(std::vector<std::string> param) {
for (const auto& p : param) {
std::cout << "SomeOtherAPI : " << p << "\n";
}
}
};

int main() {

// Sample resource vector for demonstration
std::vector<std::string> resources = {"one", "two", "three"};

// Gets rid of uninitialization error -- alternatively declare on stack
nsp::Manager* rManager = new nsp::Manager;

// You need instances of an object to bind to member functions
SomeAPIs api1;
SomeOtherAPI api2;

// Use the first APIs function as callback
rManager->registerPolicyActionCallback(std::bind(&SomeAPIs::policyActionCallback, &api1, std::placeholders::_1));
policyCallback(resources);

// Use the second APIs function as callback
rManager->registerPolicyActionCallback(std::bind(&SomeOtherAPI::policyActionCallback, &api2, std::placeholders::_1));
policyCallback(resources);

delete rManager;
}

这是一个live demo .

关于c++ - 你能解释一下下面多种操作数的混合吗? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35170995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com