Molto spesso nelle definizioni di classe C++, in particolare nelle biblioteche, di classe tratto ecc, si vede il codice simile al seguente frammento:Perché i parametri del modello typename non sono riconosciuti implicitamente come tipi?
template <typename Bar, typename Baz>
class Foo {
using bar_type = Bar;
using baz_type = Baz;
// ... etc.
}
E solo con queste righe si può in seguito fare riferimento a Foo<A,B>::bar_type
o Foo<C,D>:baz_type
. Mi chiedo: perché lo standard del linguaggio non richiede che il compilatore definisca automaticamente i tipi usando i parametri del modello typename, ovvero consenti la rimozione delle due linee usando e riconosca Foo<A,B>::Bar
come A
e Foo<C,D>::Baz
come D
?
Questo non dovrebbe nemmeno violare il codice esistente, poiché all'interno di Foo, gli identificatori Bar e Baz sono già stati presi comunque.
Perché potrebbero non essere tipi. Ad esempio, potrebbero essere un valore, ad esempio, N in 'template struct array' –
davidbak
Non sono sempre necessari e esponendoli significa che il codice client può essere accoppiato a loro (assumendo che tu significava che quegli alias erano pubblici.) – juanchopanza
Un'altra risposta: perché è banale fare te stesso. Qual è stata la risposta data quando qualcuno ha chiesto perché non c'è una parola chiave 'super' in C++ (ma non ho il riferimento a quello a portata di mano). – davidbak