c++ - 自动扩展宏
问题描述
我尝试扩展我对宏及其用法的了解。
我遇到了一个特定的问题。
这是我的情况
- 我有一个名为
RudyObject
GetRudyObjectID()
这个类对 member( ) 和 static( )都有一个 get 函数GetStaticRudyObjectID()
。
这是我的问题
我计划创建适应给定情况的宏。
这是我想解决的场景
TYPEOF
(变量值类型)应该扩展为变量。GetRudyObjectID()
TYPEOF
(变量指针)应该扩展为变量->GetRudyObjectID()
TYPEOF
(type) 应该扩展 astype::GetStaticRudyObjectID()
对于这种情况,你们有什么解决方案、提示或指导。
解决方案
前两个你可以很容易地通过一个专门用于指针(via if constexpr
)的模板来获得,第三个是另一个只接受模板参数的重载:
#include <string>
#include <iostream>
template <typename T>
auto type_of(const T& t){
if constexpr (std::is_pointer_v<T>) {
return std::string{"a pointer \n"};
}
else {
return std::string{"not a pointer \n"};
}
}
template <typename T>
auto type_of() {
return std::string{"type_of without parameter \n"};
}
int main()
{
int x;
std::cout << type_of(x);
std::cout << type_of(&x);
std::cout << type_of<int>();
return 0;
}
not a pointer
a pointer
type_of without parameter
我建议您不要为此使用宏。它们在自动代码生成中占有一席之地,但使用它们来节省一些输入通常会导致代码难以阅读、维护和调试,而其他 C++ 特性可以轻松地替换它们而没有所有这些缺点。此外,宏在代码编译之前被扩展,即预处理器不知道类型、指针或变量。宏只是关于替换令牌。
推荐阅读
- azure - adf 函数根据模式仅读取文件名的某些部分
- c# - Htmlagilitypack 获取所有节点,而不仅仅是 FirstOrDefault
- python - “我们很抱歉,找不到客户端”FreeIPA,Keycloak 设置
- sql - 将 Thu Sep 02 16:29:11 UTC 2021 转换为雪花中的时间戳
- firebase - 如何限制对 Firestore 数据库的访问仅限来自特定域的请求?
- javascript - 使用JS合并两个相同的字符串,它们出现在数组中的一行中
- excel - 根据 Excel VBA 中的输入月/年创建最近 12 个月的数组,包括月和年
- python - pip3 安装不工作无效语法?(视窗)
- ios - 在使用 fastlane 部署 firebase 分发时,在 React Native 应用程序中出现 PhaseScriptExecution 错误
- dart - Dart null 安全性和使用 json_serializable 将 JSON 解析为模型