Skip to content

Instantly share code, notes, and snippets.

@jerrylususu
Last active June 12, 2024 16:02
Show Gist options
  • Save jerrylususu/688b3643f6db5453fde8cb093786d553 to your computer and use it in GitHub Desktop.
Save jerrylususu/688b3643f6db5453fde8cb093786d553 to your computer and use it in GitHub Desktop.
有namespace的宏替换
// 对于没有命名空间的变量
#define BUILD_MY_FUNC_SINGLE(name) Build##name##Processor()
// 对于有命名空间的变量
#define BUILD_MY_FUNC_NS(ns, name) Build##ns##name##Processor()
// 定义一个辅助宏,根据参数数量调用正确的宏
#define GET_MACRO(_1,_2,NAME,...) NAME
#define BUILD_MY_FUNC(...) GET_MACRO(__VA_ARGS__, BUILD_MY_FUNC_NS, BUILD_MY_FUNC_SINGLE)(__VA_ARGS__)
#include <iostream>
// 示例处理器
struct BuildmynamespaceConstNameProcessor {
void operator()() const {
std::cout << "Processing in BuildmynamespaceConstNameProcessor" << std::endl;
}
};
struct BuildOLD_CONST_WITHOUT_NSProcessor {
void operator()() const {
std::cout << "Processing in BuildOLD_CONST_WITHOUT_NSProcessor" << std::endl;
}
};
int main() {
// 使用有命名空间的处理器
auto processor1 = BUILD_MY_FUNC(mynamespace, ConstName);
processor1();
// 使用没有命名空间的处理器
auto processor2 = BUILD_MY_FUNC(OLD_CONST_WITHOUT_NS);
processor2();
return 0;
}
// #include <iostream>
// 用于间接调用函数的宏,这个宏负责将结果合并并调用实际的函数
#define INVOKE_FUNC(func) func()
#define CONCATENATE_DETAIL(x, y) x ## y
#define CONCATENATE(x, y) CONCATENATE_DETAIL(x, y)
#define INVOKE_HELPER(func) INVOKE_FUNC(func)
// 使用间接宏来生成函数名
#define INNER_LOGIC(var_name) INVOKE_HELPER(CONCATENATE(Invoke, CONCATENATE(var_name, func)))
// 定义处理器动作
void InvokeBuildmynamespaceConstNameProcessorfunc() {
// std::cout << "Invoked BuildmynamespaceConstNameProcessor function" << std::endl;
}
void InvokeBuildOLD_CONST_WITHOUT_NSProcessorfunc() {
// std::cout << "Invoked BuildOLD_CONST_WITHOUT_NSProcessor function" << std::endl;
}
// 修改后的宏定义
#define BUILD_MY_FUNC_SINGLE(name) Build##name##Processor
#define BUILD_MY_FUNC_NS(ns, name) Build##ns##name##Processor
#define GET_MACRO(_1,_2,NAME,...) NAME
#define BUILD_MY_FUNC(...) GET_MACRO(__VA_ARGS__, BUILD_MY_FUNC_NS, BUILD_MY_FUNC_SINGLE)(__VA_ARGS__)
int main() {
// 使用有命名空间的处理器名称
INNER_LOGIC(BUILD_MY_FUNC(mynamespace, ConstName));
// 使用没有命名空间的处理器名称
INNER_LOGIC(BUILD_MY_FUNC(OLD_CONST_WITHOUT_NS));
return 0;
}
#define BUILD_MY_FUNC(namespace, name) Build##namespace##_##name##Processor
void Buildmynamespace_ConstNameProcessor() {};
void Build_OLD_CONST_WITHOUT_NSProcessor() {};
int main() {
auto processor1 = BUILD_MY_FUNC(mynamespace, ConstName);
auto processor2 = BUILD_MY_FUNC(, OLD_CONST_WITHOUT_NS); // 如果没有命名空间,第一个参数留空
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment