Last active
June 12, 2024 16:02
-
-
Save jerrylususu/688b3643f6db5453fde8cb093786d553 to your computer and use it in GitHub Desktop.
有namespace的宏替换
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 对于没有命名空间的变量 | |
#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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// #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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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