未命名文档
You are a helpful assistant.
你好
你好!很高兴见到你,有什么我可以帮忙的吗?无论是聊天、解答问题,还是提供建议,我都在这里哦!
tokens used: 78, model: SiliconFlow API (deepseek-ai/DeepSeek-V3)
C++中如何通过宏获取类的名字,就像__func__获取函数名一样
在 C++ 中,没有一个直接的标准宏可以像 __func__
获取函数名那样直接获取类的名字。但你可以通过一些技巧来实现类似的功能。
方法一:使用预处理器宏和 typeid
你可以结合使用 typeid
和 #define
宏来获取类的名字。这种方法依赖于 RTTI(运行时类型信息),可能会增加一些运行时开销。
#include <iostream>
#include <typeinfo>#define CLASS_NAME(obj) typeid(obj).name()class MyClass {
public:void printClassName() {std::cout << "Class name: " << CLASS_NAME(*this) << std::endl;}
};int main() {MyClass obj;obj.printClassName();return 0;
}
方法二:使用 __PRETTY_FUNCTION__
或 __FUNCTION__
在某些编译器中,__PRETTY_FUNCTION__
或 __FUNCTION__
可以返回包含类名的详细函数签名。你可以通过解析这个字符串来获取类名。
#include <iostream>
#include <string>#define GET_CLASS_NAME() std::string(__PRETTY_FUNCTION__).substr(0, std::string(__PRETTY_FUNCTION__).find("::"))class MyClass {
public:void printClassName() {std::cout << "Class name: " << GET_CLASS_NAME() << std::endl;}
};int main() {MyClass obj;obj.printClassName();return 0;
}
方法三:手动定义类名
你也可以手动定义一个宏来保存类名,然后在需要的地方使用它。
#include <iostream>#define DEFINE_CLASS_NAME(className) \static const char* class_name() { return #className; }class MyClass {
public:DEFINE_CLASS_NAME(MyClass)void printClassName() {std::cout << "Class name: " << class_name() << std::endl;}
};int main() {MyClass obj;obj.printClassName();return 0;
}
方法四:使用模板元编程
通过模板元编程,你可以在编译时获取类的名字。
#include <iostream>
#include <typeinfo>template <typename>
const char* get_class_name() {return typeid(T).name();
}class MyClass {
public:void printClassName() {std::cout << "Class name: " << get_class_name<myclass>() << std::endl;}
};int main() {MyClass obj;obj.printClassName();return 0;
}
总结
虽然 C++ 没有直接提供像 __func__
那样的宏来获取类名,但通过结合使用预处理器宏、RTTI、编译器特定宏或模板元编程,你可以实现类似的功能。选择哪种方法取决于你的具体需求和编译器支持的特性。
给我一些图表示例,例如plantuml,然后给我一些图片
图表示例:PlantUML
PlantUML 是一种用于绘制 UML 图表的工具,支持多种图表类型,如类图、时序图、用例图等。以下是几个常见的 PlantUML 示例:
1. 类图(Class Diagram)
@startuml
class Car {+String brand+int speed+void accelerate()+void brake()
}class Driver {+String name+void drive(Car car)
}Car "1" -- "1" Driver : drives >
@enduml
说明: 这个类图展示了 Car
和 Driver
类之间的关系,Driver
类通过 drive
方法操作 Car
类。
2. 时序图(Sequence Diagram)
@startuml
Alice -> Bob: 请求数据
Bob -> Alice: 返回数据
@enduml
说明: 这个时序图展示了 Alice
和 Bob
之间的交互过程,Alice
向 Bob
发送请求,Bob
返回数据。
3. 用例图(Use Case Diagram)
@startuml
actor User
rectangle "系统" {User --> (登录)User --> (注册)(登录) --> (查看个人信息)(注册) --> (完善资料)
}
@enduml
说明: 这个用例图展示了用户与系统之间的交互,用户可以进行登录和注册操作,登录后可以查看个人信息,注册后需要完善资料。
图片示例
以下是几张示例图片,展示不同场景和内容:
1. 示例图片 1:风景
2. 示例图片 2:人物
3. 示例图片 3:抽象艺术
4. 示例图片 4:图标集合
总结
PlantUML 是一种强大的工具,可以帮助你绘制各种 UML 图表,清晰展示系统设计和交互流程。图片则可以用来丰富内容,增强视觉效果。根据实际需求选择合适的图表和图片,可以让你的笔记或文档更加生动和易于理解。
备注: 以上图片均为占位符图片,实际使用时可以替换为相关内容的图片。
测试图片
测试文件
ZBOSS_NCP_Serial_Protocol_1_5.pdf