std::tuple
è una bestia altamente caricata di modelli. Per accedere al n-esimo compilatore di membri è necessario eseguire numerose istanze di template, sebbene la sua natura semplice: l'accesso all'n-esimo membro dei dati della corrispondente struttura immaginaria. Sembra che std::tuple
dovrebbe essere una caratteristica del linguaggio di base, qualcosa di simile a questo (pseudocodice):Aggregati variabili come lingua principale
template< typename ...types >
struct/* or class, or even union */ V
{
types... V; // defines implicitly `operator [/*constant expression*/]` to access by index
// if more than one variadic parameter pack provided
// (during expanding of parameter pack of template
// parameters in specializations) then instead of
// `V` there can be specific data-member name (say, `x`),
// but still with `x.operator []` implicitly defined
// member functions and data members allowed
};
template< typename ...types >
V< std::decay_t<types>... > make_tuple(types &&... args)
{ return {std::forward<types>(args)...}; }
template< typename ...types >
V< types &&... > forward_as_tuple(types &&... args)
{ return {std::forward<types>(args)...}; }
template< typename ...types >
V< types &... > tie(types &... args)
{ return {args...}; }
C'è qualche proposta di qualcosa come lingua supportata variadic data-membri definizione di sintassi per le classi?
Qual è il vantaggio di averlo reso disponibile per la lingua principale? perché solo 'std :: tuple'? perché non anche 'std :: vector'? Il mio pensiero è che se qualcosa può essere fatto come funzionalità di libreria, dovrebbe essere fatto, * solo se * che non è possibile (o troppo hacky per farlo) ha senso aggiungere funzionalità linguistiche. – Nawaz
@Nawaz POD array (singolo tipo, più valori) già presente in linguaggio, 'int x [3] = {1, 2, 3};'. – Orient
Indipendentemente da 'tipi ... V;', 'operator [] (size_t)' non può esistere. – Barry