2013-08-05 2 views
6

Мы используемA min = idiom в C++?

x += y 

вместо

x = x + y 

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

x min= y 

вместо

x = std::min(x, y) 

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

+8

Да. 'x min = y' обычно называют синтаксической ошибкой *. :) –

+0

'if (y

+1

Вы не можете придумывать новые операторы на C++, так что идиома - это то, что вы написали: 'x = std :: min (x, y) '. –

ответ

21

Это, конечно, не идиоматическое , но вы могли бы использовать что-то, называемое с именами операторов (см этих Q & Как here и here, разработанных @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 из выражения с мин в левой и правой частях.

+11

... это безумие ... (+1 хотя, действительно интересно) – Dariusz

+3

+1 для демонстрации тайных сил, развязанных маской шаблона – Hulk

+5

+1, потому что это потрясающе. Ваше имя подходит вам: D – Xaqq

0

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

1

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

+0

Итак, как принято считать, есть такая вещь ... – einpoklum

0

опции, которые вы имеете:

x = std::min(x,y) 

или

x = y < x ? y : x; 

или

if (y < x) 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)) 

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

+0

Мне нужна идиома для условного присвоения, а не для максимальных значений. – einpoklum

2

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

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

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

mineq(x, y); 

я вопрос, стоит ли беспокоиться, однако.

0

C++ имеет ограниченный набор operators и keywords.

Что вы пытаетесь сделать, это вне спецификации C++, и это невозможно.

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

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

+1

Вы забыли 6 символов пробела ... –

+0

Только шесть? Я считаю восемь. –

+0

@James 'x = (x SPACE1