是否可以制作自定义运算符,以便您可以执行此类操作?
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/