动机:我试图根据是否定义某个宏来定义模板参数。如果定义了宏,模板将选择不同的专业化。我可以将整个专业化放在一个巨大的#ifdef
中,但我正在寻找一种更简单的方法。
问题:有没有办法检查表达式中是否定义了宏,即不使用#ifdef
?这就是我的意思:
int main()
{
std::cout << CHECK(macro) << " should print 0\n";
#define macro
std::cout << CHECK(macro) << " should print 1\n";
#undef macro
#define macro 1
std::cout << CHECK(macro) << " should print 1\n";
#undef macro
#define macro ""
std::cout << CHECK(macro) << " should print 1\n";
#undef macro
std::cout << CHECK(macro) << " should print 0\n";
}
到目前为止,我有两个选项,这是在运行时:
#define CHECK_HELPER(x, y) (strcmp(#x, y) != 0)
#define CHECK(x) CHECK_HELPER(x, #x)
这是在编译时完成的,但不是很好:
#define CHECK_HELPER(...) (#__VA_ARGS__[0] == '1' || #__VA_ARGS__[0] == '\0')
#define CHECK(...) CHECK_HELPER(__VA_ARGS__)