【问题标题】:Use macro to overload certain uses of ternary operator ?:使用宏重载三元运算符的某些用途?:
【发布时间】:2013-12-02 03:12:25
【问题描述】:

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 编写的新代码

【问题讨论】:

  • 什么样的研究项目需要这个,令人难以置信。如果你想设计自己的语言,你可以为 LLVM 写一个新的前端。如果你不这样做,那么你很难理解为什么你会以如此野蛮的方式掩盖一种原本很好的语言......
  • 我不太明白这个问题,但如果答案是“是的,你可以使用宏来做你想做的事”,那么你应该注意正确地为宏加上括号。例如:#define TO_NEG(a) (((a) >= 0) (a) : -(a))
  • 但是反过来不行吗?你其实很想#define ((a >= 0) ? a : -a) TO_NEG(a),但我觉得不可能……
  • @PiotrZierhoffer 是的,这就是我想做的……如果可能的话。

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


【解决方案1】:

是的,您可以在宏中使用三元运算符,但它们必须正确括起来:

#define TO_NEG(a) (a >= 0) ? (a) : -(a)
#define MAX(a,b)  (a >= b) ? (a) : (b)

【讨论】:

  • 减号不应该放在括号外面吗? TO_NEG(a + b) 应该扩展到 -(a + b),而不是 (-a + b)
【解决方案2】:

假设您的运算符 >= 产生 MyBool 类型,我认为您几乎可以做到:

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

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

注意几点:

  1. 如果a 为0 且b 为负数,则这不适用于a&gt;=b
  2. 这是一个非常可怕的 hack,会在许多边缘情况下崩溃。
  3. 您实际上不能将: 用作#define 中的符号,因此您必须使用其他方法来替换它们,此时您可能应该使用@ 之类的东西raxvan 的回答

【讨论】:

  • 感谢您的有趣回答。你是说因为3.中的原因不能做?
  • 正确。您必须使用 c 预处理器以外的解析器来替换 ?和 : 首先使用有效的 c 标识符。而且它必须比简单的搜索和替换更复杂,否则你也会在大小写标签中挖出冒号。
  • 跟进:我永远无法实现这一点,如this answer中所述。然而,我设法通过调整架构的另一部分来实现我的目标。
【解决方案3】:

您可以定义一些东西来替换 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)

【讨论】:

  • 第二个单词应该是can't吗?
  • 谢谢@Raxvan。请您详细说明一下,我还看不到如何应用它。
猜你喜欢
  • 2016-04-30
  • 1970-01-01
  • 2019-03-29
  • 2012-04-02
  • 2020-03-14
  • 2012-10-15
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多