6

我们用

x += y

代替

x = x + y

*,/,-和其他运营商类似。那么,怎么样

x min= y

代替

x = std::min(x, y)

? 该命令是否有一个常用的习惯用法,不需要使用另一个运算符(不可能)扩展语言?

4

7 回答 7

21

这当然不是惯用的,但您也许可以使用称为命名运算符的东西(请参阅此处此处的这些问答,由 @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用作模板参数的模板参数,将使用Flhs 和 rhs 的最小值更新表达式的 lhs。

于 2013-08-05T09:53:19.353 回答
2

你不能以这种方式扩展语言。你可以来的最接近的是:

template <typename T, typename U>
T&
mineq( T& lhs, U rhs )
{
    if ( rhs < lhs ) {
        lhs = rhs;
    }
    return lhs;
}

这将允许编写:

mineq( x, y );

然而,我质疑这是否值得。

于 2013-08-05T09:56:17.187 回答
1

不。没有这样的事情,你将不得不与std::min(x,y);

于 2013-08-05T09:48:46.263 回答
1

不,不可能创建新的自定义运算符。

不过,您有一些可用的解决方案:

llama_min_age = std::min(x, y);
llama_min_age = (x < y ? x : y);

如果你想的话,甚至是一个宏:

#define MIN(x, y) ((x) < (y) ? (x) : (y))

关于宏:它会导致恶性错误,所以我更愿意使用前两个解决方案之一。

于 2013-08-05T09:54:27.867 回答
0

你不能写这种句子,它们是为内置语法保留的

于 2013-08-05T09:48:24.760 回答
0

您拥有的选项:

x = std::min(x,y)

或者

x = y < x ? y : x;

或者

if (y < x) x = y;
于 2013-08-05T09:50:34.873 回答
0

C++ 有一组有限的运算符关键字

您正在尝试做的事情超出了 C++ 规范,并且是不可能的。

如果需要,您可以使用此单线进行比较和分配:

x = (x < y) ? x : y;

于 2013-08-05T09:56:19.840 回答