2013-08-05 6 views
6

UsiamoUn min = idioma in C++?

x += y 

invece di

x = x + y 

E allo stesso modo per *,/,- e altri operatori. Beh, che dire

x min= y 

invece di

x = std::min(x, y) 

? Esiste un idioma comunemente usato per questo comando, che non richiede l'estensione (impossibile) della lingua con un altro operatore?

+8

Sì. 'x min = y' è comunemente chiamato * errore di sintassi *. :) –

+0

'if (y

+1

Non puoi inventare nuovi operatori in C++ come questo, quindi l'idioma è ciò che hai scritto: 'x = std :: min (x, y) '. –

risposta

21

E 'certamente non idiomatica , ma potresti essere in grado di utilizzare qualcosa chiamato con nome operatori (vedere questi Q & Come here e here, sviluppato da @Yakk e @KonradRudolph), e scrivere

x <min>= y; 

che è reso possibile da sovraccarico operator< e operator>, combinato con un intelligente avvolto named_operator. Il codice completo è dato dal link qui sopra, ma usa il codice come

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); 
} 

Utilizzando come modello std::min argomento per il parametro modello F, sarebbe aggiornare i LHS dell'espressione con il minimo dei sx e dx.

+11

... questa è follia ... (+1 però, davvero interessante) – Dariusz

+3

+1 per dimostrare i poteri arcani scatenati dal magico modello – Hulk

+5

+1 perché è fantastico. Il tuo nome ti sta bene: D – Xaqq

0

Non è possibile scrivere questo tipo di frasi, che sono riservati per il built-in syntaxt

1

NO. Non v'è nulla di simile, avrete a che fare con std::min(x,y);

+0

Quindi, come suggerito dalla risposta accettata, esiste una cosa del genere ... – einpoklum

0

Le opzioni che si hanno:

x = std::min(x,y) 

o

x = y < x ? y : x; 

o

if (y < x) x = y; 
1

No, non è possibile creare nuovi operatori personalizzati.

avete un paio di soluzioni a disposizione però:

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

O anche una macro se si desidera:

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

Circa la macro: si può portare a bug vizioso, quindi io preferirei utilizzare una delle prime due soluzioni.

+0

Volevo un idioma per l'assegnazione condizionale, non per i valori massimi. – einpoklum

2

Non è possibile estendere la lingua in questo modo.Il più vicino si può venire è qualcosa di simile:

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

Ciò consentirebbe di scrittura:

mineq(x, y); 

mi chiedo se vale la pena il fastidio, però.

0

C++ ha un numero limitato di operators e keywords.

Quello che stai cercando di fare è al di fuori delle specifiche C++ e non è possibile.

Si può fare il confronto e l'assegnazione a questo one-liner, se si desidera:

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

+1

Hai dimenticato 6 caratteri spaziali ... –

+0

Solo sei? Conto otto. –

+0

@James 'x = (x SPAZIO1