使用宏来重载三元运算符的某些用途?:

时间:2013-11-18 20:05:08

标签: c++ c macros operator-overloading ternary-operator

Overload ternary ?: operator, or change to if{}else{} in included files的后续行动。)

上下文

这里的研究项目。在我的C ++库中,我使用#include "aprogram.c"包含C文件,我通过重载(几乎)所有运算符来执行符号。

对于以下情况,我必须能够检测(condition) ? this : that并提取conditionthisthat以用于我的符号执行库:

(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)?

修改:澄清

有了这个,我想实现我的库

  1. 检测?:两种情况
  2. 将其转换为TO_NEG或MAX
  3. 使用我为TO_NEG和MAX
  4. 编写的新代码

3 个答案:

答案 0 :(得分:2)

假设您的运算符> =生成MyBool类型,我认为您几乎可以使用:

#define ? .ternary(
#define : )||

template <typename T>
T MyBool::ternary(T val) { 
  if (m_isTrue) return val;
  return T(0)
}

有几点需要注意:

  1. 如果a>=b为0且a为负数,则对b不起作用。
  2. 这是一个可怕的可怕的黑客攻击,会在很多边缘案件中破裂。
  3. 您无法在: 中使用#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)