Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

make_unique, enable_if?

29 views
Skip to first unread message

Emanuele Merlo

unread,
Apr 5, 2018, 3:55:09 AM4/5/18
to
Qualcuno sa spiegarmi i segreti della definizione di make_unique, in particolare perché c'è "enable_if"?

template<class _Ty,
class... _Types> inline
typename enable_if<!is_array<_Ty>::value,
unique_ptr<_Ty> >::type make_unique(_Types&&... _Args)
{ // make a unique_ptr
return (unique_ptr<_Ty>(new _Ty(_STD forward<_Types>(_Args)...)));
}

fma...@gmail.com

unread,
Apr 5, 2018, 3:19:57 PM4/5/18
to
On Thursday, April 5, 2018 at 3:55:09 AM UTC-4, Emanuele Merlo wrote:
> Qualcuno sa spiegarmi i segreti della definizione di make_unique, in
> particolare perché c'è "enable_if"?
>

https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error

make_unique non deve avere quell'overload per gli array, probabilmente
perché ce n'è uno specializzato prima o dopo quel pezzo di codice.

Ciao!

enoquick

unread,
Apr 5, 2018, 9:49:50 PM4/5/18
to
hai toccato una delle parti piu complesse e meno conosciute di C++
La definizione a compile time di metodi che esistono solo se sono
soddisfatte alcune condizioni (in questo caso se _Ty non e' un array)




fma...@gmail.com

unread,
Apr 5, 2018, 9:53:31 PM4/5/18
to
On Thursday, April 5, 2018 at 9:49:50 PM UTC-4, enoquick wrote:
> Il 05/04/2018 02:55, Emanuele Merlo ha scritto:
> > Qualcuno sa spiegarmi i segreti della definizione di make_unique, in
> > particolare perché c'è "enable_if"?
>
> hai toccato una delle parti piu complesse e meno conosciute di C++
> La definizione a compile time di metodi che esistono solo se sono
> soddisfatte alcune condizioni (in questo caso se _Ty non e' un array)
>

In fondo è il risultato dello stesso argomento di cui parlavamo nell'ultimo
thread, le r-value references.
Il C++11 s'è portato dietro un sacco di novità. Sono comunque 6-7 anni fa.

Ciao!

enoquick

unread,
Apr 5, 2018, 10:00:04 PM4/5/18
to
Si,alcune novita interessanti come l' errore in compilazione di un
procedura/metodo template non e' un errore ma solo una esclusione (in
c++98 e' un errore)
Questo permette di implementare cose come i metodi inclusi o esclusi a
compile time,come l'esempio sopra
In c++ 20 forse introdurranno i concetti,che fara' fare un altro salto
di qualita nella scrittura di codice robusto

0 new messages