我们用
x += y
代替
x = x + y
*,/,-
和其他运营商类似。那么,怎么样
x min= y
代替
x = std::min(x, y)
? 该命令是否有一个常用的习惯用法,不需要使用另一个运算符(不可能)扩展语言?
我们用
x += y
代替
x = x + y
*,/,-
和其他运营商类似。那么,怎么样
x min= y
代替
x = std::min(x, y)
? 该命令是否有一个常用的习惯用法,不需要使用另一个运算符(不可能)扩展语言?
这当然不是惯用的,但您也许可以使用称为命名运算符的东西(请参阅此处和此处的这些问答,由 @Yakk 和 @KonradRudolph 开发),并编写
x <min>= y;
这可以通过重载operator<
andoperator>
结合巧妙的 Wrapped 来实现named_operator
。完整的代码由上面的链接给出,但使用类似的代码
template <typename T1, typename T2, typename F>
inline auto operator >(named_operator_lhs<T1, F> const& lhs, T2 const& rhs)
-> decltype(lhs.f(std::declval<T1>(), std::declval<T2>()))
{
return lhs.f(lhs.value, rhs);
}
std::min
用作模板参数的模板参数,将使用F
lhs 和 rhs 的最小值更新表达式的 lhs。
你不能以这种方式扩展语言。你可以来的最接近的是:
template <typename T, typename U>
T&
mineq( T& lhs, U rhs )
{
if ( rhs < lhs ) {
lhs = rhs;
}
return lhs;
}
这将允许编写:
mineq( x, y );
然而,我质疑这是否值得。
不。没有这样的事情,你将不得不与std::min(x,y);
不,不可能创建新的自定义运算符。
不过,您有一些可用的解决方案:
llama_min_age = std::min(x, y);
llama_min_age = (x < y ? x : y);
如果你想的话,甚至是一个宏:
#define MIN(x, y) ((x) < (y) ? (x) : (y))
关于宏:它会导致恶性错误,所以我更愿意使用前两个解决方案之一。
你不能写这种句子,它们是为内置语法保留的
您拥有的选项:
x = std::min(x,y)
或者
x = y < x ? y : x;
或者
if (y < x) x = y;