那有什么办法能在这种情况下,__FUNCTION__也能是函数名字吗
时间: 2024-04-16 12:26:37 浏览: 136
在 C++ 中,`__FUNCTION__` 预定义宏提供了当前函数的名称作为一个字符串常量。如果你希望在函数回调中,`__FUNCTION__` 也能是函数的名称,你可以使用一个 lambda 表达式来包装函数回调,并在 lambda 表达式中使用 `__FUNCTION__`。
下面是一个示例:
```cpp
#include <iostream>
#include <functional>
#include <vector>
// 定义观察者类型
typedef std::function<void(int)> Observer;
// 主题
class Subject {
private:
std::vector<Observer> observers;
public:
void attach(const Observer& observer) {
observers.push_back(observer);
}
void detach(const Observer& observer) {
for (auto it = observers.begin(); it != observers.end(); ++it) {
if (*it == observer) {
observers.erase(it);
break;
}
}
}
void notify(int data) {
for (auto observer : observers) {
observer(data);
}
}
};
// 具体观察者
class ConcreteObserver {
public:
void update(int data) {
std::cout << "ConcreteObserver received update from function: " << __FUNCTION__ << std::endl;
std::cout << "Data: " << data << std::endl;
}
};
int main() {
// 创建主题和观察者
Subject subject;
ConcreteObserver observer;
// 注册观察者
subject.attach([&observer](int data) { observer.update(data); });
// 发送更新通知
subject.notify(1);
return 0;
}
```
在这个示例中,我们将观察者的函数回调包装在一个 lambda 表达式中,并在 lambda 表达式内部使用 `__FUNCTION__`。当触发观察者的函数回调时,你会看到输出结果类似于:
```
ConcreteObserver received update from function: update
Data: 1
```
这样,`__FUNCTION__` 就可以显示为函数的名称了。请注意,每个观察者都可以有不同的函数名,因为每个观察者都有自己的 `update` 函数。
希望这个解答对你有帮助!如果还有其他问题,请随时提问。
阅读全文