c++ - 您可以在 C++ 中制作自定义运算符吗?

标签 c++ templates operators c-preprocessor metaprogramming

是否可以制作自定义运算符,以便您可以执行此类操作?

if ("Hello, world!" contains "Hello") ...

注意:这是一个独立于“...是个好主意”的问题;)

最佳答案

是的! (嗯,有点)

有几个公开可用的工具可以帮助您。两者都使用预处理器代码生成来创建实现自定义运算符的模板。这些运算符由一个或多个内置运算符以及标识符组成。

由于这些实际上不是自定义运算符,而只是运算符重载的技巧,因此有一些警告:

  • 宏是邪恶的。如果你犯了一个错误,编译器将几乎完全无法追踪问题。
  • 即使你得到了正确的宏,如果你的操作符的使用或你的操作的定义有错误,编译器也只会稍微有帮助。
  • 您必须使用有效的标识符作为运算符的一部分。如果您想要一个更像符号的运算符,您可以使用 _o 或类似的简单字母数字。

CustomOperators

当我为此目的开发自己的库时(见下文),我遇到了这个项目。下面是创建 avg 运算符的示例:

#define avg BinaryOperatorDefinition(_op_avg, /)
DeclareBinaryOperator(_op_avg)
DeclareOperatorLeftType(_op_avg, /, double);
inline double _op_avg(double l, double r)
{
   return (l + r) / 2;
}
BindBinaryOperator(double, _op_avg, /, double, double)

IdOp

最初是 an exercise in pure frivolity成为我自己对这个问题的看法。这是一个类似的例子:

template<typename T> class AvgOp { 
public: 
   T operator()(const T& left, const T& right) 
   {
      return (left + right) / 2; 
   }
};
IDOP_CREATE_LEFT_HANDED(<, _avg_, >, AvgOp)
#define avg <_avg_>

主要区别

  • CustomOperators 支持后缀一元运算符
  • IdOp 模板使用引用而不是指针来消除对免费存储的使用,并允许对操作进行完整的编译时评估
  • IdOp 允许您轻松地为同一个根标识符指定多个操作

关于c++ - 您可以在 C++ 中制作自定义运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1515399/

相关文章:

c++ - 为什么在实现单例类时得到 "Undefined reference error"?

c++ - template<typename> - 它是如何工作的?

c++ - 如何推断 C++11 中的模板参数类型?

c++ - 找到最多 k 个的最长二进制子序列的长度

c++ - 关于 C++ 中接口(interface)类的使用

c++ - 具有多个 vector 的类模板实现

java - 为什么有前缀/后缀++而没有前缀/后缀+=?

c++ - 我的预增量工作正常,但后增量不行

c - return 是运算符还是函数?

c++ - 线程和互斥量