_Achille
Utente Èlite
- Messaggi
- 3,067
- Reazioni
- 725
- Punteggio
- 131
Salve ragazzi e buona domenica.
Spulciando online mi è più volte capitato di trovare online utilizzi molto potenti dei template su C++, poco chiari ai miei occhi. Cercando allora sono arrivato alla conclusione che si tratta di metaprogrammazione, che dovrebbe essere un approccio come lo è la programmazione funzionale, dinamica ecc...
Ho quindi creato, molto faticosamente, del codice che dovrebbe risalire alla metaprogrammazione:
Va detto che i template sono una delle pari più dolenti a me del C++, dato che non vedevo oltre all'uso nella programmazione generica.
È poi semplice utilizzare la struttura creata in vari modi
Ed è così possibile sapere se il parametro ha un operator*() con overload.
E quindi
Quindi in tutto ciò la metaprogrammazione permette di sapere se un argomento al template ha determinate caratteristiche. E poi? Davvero questa complessità per tale cosa? Perché non implementare una clausola where come C#? Cos'altro permette di fare la metaprogrammazione?
Lo chiedo specialmente perché vi sono vari libri che spiegano la metaprogrammazione al costo non molto contenuto. Qualcuno la ha mai affrontata? Grazie
Spulciando online mi è più volte capitato di trovare online utilizzi molto potenti dei template su C++, poco chiari ai miei occhi. Cercando allora sono arrivato alla conclusione che si tratta di metaprogrammazione, che dovrebbe essere un approccio come lo è la programmazione funzionale, dinamica ecc...
Ho quindi creato, molto faticosamente, del codice che dovrebbe risalire alla metaprogrammazione:
C++:
using namespace std;
template <class, class = void>
struct is_a_pointer : false_type { };
template <class T>
struct is_a_pointer<T, void_t<decltype(*declval<T&>())>> : true_type { };
Va detto che i template sono una delle pari più dolenti a me del C++, dato che non vedevo oltre all'uso nella programmazione generica.
È poi semplice utilizzare la struttura creata in vari modi
C++:
template <class T>
constexpr auto checkDerefOperator() noexcept -> bool
{
return is_a_pointer<T>::value;
}
E quindi
C++:
template <class T>
constexpr void failIfNotAPointer() noexcept
{
static_assert(checkDerefOperator<T>(), "Not a pointer!");
}
// Questo non centra praticamente nulla
template <class T>
auto dereference(T& t) noexcept -> decltype (*t)
{
return *t;
}
Quindi in tutto ciò la metaprogrammazione permette di sapere se un argomento al template ha determinate caratteristiche. E poi? Davvero questa complessità per tale cosa? Perché non implementare una clausola where come C#? Cos'altro permette di fare la metaprogrammazione?
Lo chiedo specialmente perché vi sono vari libri che spiegano la metaprogrammazione al costo non molto contenuto. Qualcuno la ha mai affrontata? Grazie
Ultima modifica: