(Overload ternary ?: operator, or change to if{}else{} in included files的后续行动。)
上下文
这里的研究项目。在我的C ++库中,我使用#include "aprogram.c"
包含C文件,我通过重载(几乎)所有运算符来执行符号。
对于以下情况,我必须能够检测(condition) ? this : that
并提取condition
,this
和that
以用于我的符号执行库:
(a >= 0) ? a : -a
(a >= b) ? a : b
概念性问题
因为我不能在C ++中重载三元?:运算符,并且只需要对上述情况起作用,所以不能通过使用宏来重载它们:
#define TO_NEG(a) ((a >= 0) ? a : -a)
#define MAX(a,b) ((a >= b) ? a : b)
并实现TO_NEG(a)和MAX(a,b)?
修改:澄清
有了这个,我想实现我的库
答案 0 :(得分:2)
假设您的运算符> =生成MyBool
类型,我认为您几乎可以使用:
#define ? .ternary(
#define : )||
template <typename T>
T MyBool::ternary(T val) {
if (m_isTrue) return val;
return T(0)
}
有几点需要注意:
a>=b
为0且a
为负数,则对b
不起作用。:
中使用#define
作为符号,因此您必须使用其他方法替换它们,此时,你可能应该使用@ raxvan的回答答案 1 :(得分:1)
您可以定义一些内容来替换c源文件中的?
运算符。
您可以做的最接近的事情如下:
#define QUESTION_OPERATOR(COND,THIS,THAT) ((COND) ? (THIS) : (THAT))
//here you can do custom validations to all the parts if you want
用法:
(cond) ? (This) : (That) //you need to replace this with:
QUESTION_OPERATOR(cond,This,That)
答案 2 :(得分:0)
是的,你可以在宏中使用三元运算符,但它们必须正确括号:
#define TO_NEG(a) (a >= 0) ? (a) : -(a)
#define MAX(a,b) (a >= b) ? (a) : (b)