C ++ 11 — Мин = идиома в C ++?

Мы используем

x += y

вместо

x = x + y

И аналогично для *,/,- и другие операторы. Ну как насчет

x min= y

вместо

x = std::min(x, y)

? Существует ли обычно используемая идиома для этой команды, не требующая (невозможного) расширения языка с другим оператором?

6

Решение

Это, конечно, не идиоматично, но вы можете использовать то, что называется именованные операторы (см. эти Q&Как Вот а также Вот, разработано @Yakk и @KonradRudolph), и напишите

x <min>= y;

что стало возможным благодаря перегрузке operator< а также operator>в сочетании с умным завернутым 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 выражения с минимумом lhs и rhs.

21

Другие решения

Вы не можете расширить язык таким образом. Ближайший вы можете
прийти это что-то вроде:

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

Это позволило бы написать:

mineq( x, y );

Однако я сомневаюсь, стоит ли это беспокоить.

2

NO. Там нет такой вещи, вам придется делать с std::min(x,y);

1

Нет, невозможно создавать новые пользовательские операторы.

У вас есть несколько доступных решений:

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

Или даже макрос, если вы хотите:

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

О макросе: он может привести к серьезной ошибке, поэтому я бы предпочел использовать одно из первых двух решений.

1

Вы не можете писать такие предложения, они зарезервированы для встроенного синтаксиса.

0

Варианты у вас есть:

x = std::min(x,y)

или же

x = y < x ? y : x;

или же

if (y < x) x = y;
0

C ++ имеет ограниченный набор операторы а также ключевые слова.

То, что вы пытаетесь сделать, находится за пределами спецификации C ++ и невозможно.

Вы можете сделать сравнение и назначение с этой однострочником, если вы хотите:

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

0
По вопросам рекламы [email protected]