Recentemente ho preso l'abitudine di typedef
in vari tipi all'interno delle classi template, come avviene nella libreria standard. Ad esempio, una classe contenitore potrebbe sembrare qualcosa sulla falsariga di:
template<typename T>
class custom_container {
public:
typedef T value_type;
typedef value_type* pointer;
typedef value_type& reference;
typedef std::size_t size_type;
reference operator[](size_type);
// etc...
};
Tuttavia, dopo un po 'di utilizzo di questo, ho iniziato a chiedermi se fosse davvero una buona idea, nonostante la leggibilità e l'espressione di intenti presumibilmente aumentate.
Sembra controintuitivo che si possa alias, diciamo, T
in un altro tipo, dal momento che nessuno usa la classe aspettandosi che value_type
sia T
, e solo sempre T
in ogni caso ( è un custom_container<T>
dopo tutto)? Allo stesso modo, gli utenti di tale classe non sempre si aspettano che pointer
sia T*
e reference
come T&
?
Usiamo typedef
s per consentire la facilità di modificare un tipo di aliasing in un altro se necessario, tuttavia nella maggior parte dei casi che ho riscontrato, detto typedef
s è ridondante e quasi confuso, poiché non avrebbe mai senso avere l'alias sinonimo di qualsiasi altro tipo. custom_container
probabilmente non soddisferebbe le sue aspettative se value_type
è stato cambiato in qualsiasi altra cosa di T
- l'utente si aspetta che sia una sorta di contenitore di T
s.
Quindi, è ancora utile e / o un buon design fare un uso pesante di typedef
s nelle classi template come fatto nella libreria standard?