c++预处理器添加word if条件
C++ preprocessor add word if condition
我正在编写一个使用预处理器元编程Boost.Preprocessor的库。其中一个宏是这样的:
#define MY_MACRO(my_type) return some_function<my_type>()
现在,问题是,如果my_type
是void
,我需要删除return
。我检查了Boost。预处理器,但我没看到任何有用的东西。我该如何做到这一点?比如:
#define MY_MACRO(my_type) BOOST_PP_IF(
TYPE_EQUALS(my_type,void),return,BOOST_PP_EMPTY()) some_function<my_type>()
不幸的是,boost预处理器没有一个简单的方法来比较两个令牌。当然,对于您的情况,您可能只需要使用一些简单的检测。这应该在C99预处理器上工作:
#define CHECK_N(x, n, ...) n
#define CHECK(...) CHECK_N(__VA_ARGS__, 0,)
#define PROBE(x) x, 1,
#define IS_VOID(x) CHECK(BOOST_PP_CAT(IS_VOID_, x))
#define IS_VOID_void PROBE(~)
但是,对于括号、可变数据(例如带有逗号的类型)或指针,这不起作用。下面是一些有用和没用的方法:
IS_VOID(int) // 0
IS_VOID(void) // 1
IS_VOID((void)) // Compile error
IS_VOID(std::map<int, int>) // Compile error
IS_VOID(void*) // Returns 1, but should return 0
你可以尝试解决所有这些情况,或者你可以使用更通用的比较宏(像这里的):
#define IS_PAREN(x) CHECK(IS_PAREN_PROBE x)
#define IS_PAREN_PROBE(...) PROBE(~)
#define IS_COMPARABLE(x) IS_PAREN( CAT(COMPARE_, x) (()) )
#define NOT_EQUAL(x, y)
IIF(BITAND(IS_COMPARABLE(x))(IS_COMPARABLE(y)) )
(
PRIMITIVE_COMPARE,
1 EAT
))(x, y)
#define EQUAL(x, y) COMPL(NOT_EQUAL(x, y))
#define COMPARE_void(x) x
#define IS_VOID(x) EQUAL(x, void)
可以更新为使用boost预处理器组件。这应该可以在更多的情况下工作,但仍然不能与括号一起工作(这可能不是问题)。
最后,这只是文本级别的比较,所以如果用户定义了void,它将错误地返回false:
typedef void my_void;
IS_VOID(my_void) // Returns 0
如果您正在使用检测技术,您可以允许用户为用户定义的空白扩展它,如下所示:
#define IS_VOID(x) CHECK(BOOST_PP_CAT(IS_VOID_, x))
#define IS_VOID_void PROBE(~)
// User-defined void
#define IS_VOID_my_void PROBE(~)
相关文章:
- 将按位if条件转换为普通if条件
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么这个if(s[j]==s[i] && i>0)条件不适用于这个[{()}]
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 使用枚举作为条件,if 条件将返回什么,真或假?
- 为什么循环没有中断,并且 if 条件没有按预期工作?
- 使用 if 条件对数字进行分组
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 在if条件下,右或左改变值的相等性检查是否有任何区别
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 将子字符串与字符串数组进行比较的 IF 条件会在C++中产生错误
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 带有逻辑 OR 运算符的 if 条件的缩写?
- 为什么我可以将 ifstream 文件置于 if 条件?
- 如何将特征张量的值作为'if'条件表达式
- 在 c++ 中检查 if 条件中的向量位置范围
- 如何在Char数组中搜索Char在IF条件语句中
- 未正确评估'If'条件