Mi rendo conto che "perché le cose sono come sono" le domande di solito non sono le migliori, ma ci sono molte persone su SO che sono sintonizzate sulle discussioni standard del comitato, quindi spero che questo possa essere risolto di fatto, poiché sono legittimamente curioso a quale sia la risposta.Perché std :: result_of accetta un tipo di funzione (non correlato) come argomento di tipo?
Fondamentalmente, ho impiegato molto tempo per capire cosa stava succedendo con la firma del modello di std::result_of
la prima volta che l'ho visto: ho pensato che fosse un costrutto completamente nuovo per i parametri del modello che non avevo mai visto prima.
template< class F, class... ArgTypes >
class result_of<F(ArgTypes...)>;
Dopo qualche tempo a pensarci, ho capito che cosa questo realmente era: F(ArgTypes...)
è un tipo di funzione, ma è non il tipo di funzione il cui tipo di risultato è in corso di valutazione (questo è solo F
): si tratta di il tipo di una funzione che accetta gli argomenti ArgTypes...
e restituisce tipo F
.
Non è questo ... strano? Tipo di hackish? Qualcuno sa se la commissione ha mai discusso di alternative, come, per esempio, le seguenti ...
template< class F, class... ArgTypes >
class result_of<F, ArgTypes...>;
?
Immagino sia possibile che ci siano situazioni in cui il secondo costrutto non può essere usato facilmente come il primo, ma quali?
Non sto cercando di esprimere un giudizio su questo, ma è solo che questo mi ha legittimamente confuso la prima volta che l'ho visto, quindi sono curioso di sapere se c'è una buona ragione per farlo. Mi rendo conto che parte della risposta potrebbe essere semplicemente "perché Boost ha fatto" in questo modo, ma ancora che lasciano le restanti domande (di fatto) ...
C'è una ragione tecnica Boost scegliere questa sintassi per codificare tipo informazione piuttosto che qualche alternativa?
si sono avute discussioni da parte del comitato C++ 11 su come appropriata era di standardizzare questo, dato che
std::result_of
può essere implementato in termini didecltype
abbastanza facilmente in ogni caso?
+1, questa è la risposta più completa fino ad ora –
(ma per quanto mi riguarda, non credo che l'approccio "std :: tuple" faux varadic sarebbe stato troppo difficile, davvero ... potrei sbagliarmi comunque) –
@Stephen: Dovresti provare ripetutamente se la fine dell'elenco degli argomenti corrente è '_Nil', e in caso contrario, aggiungi l'argomento successivo. Per questo, hai bisogno di nuovi parametri variadici. Come si fa in C++ 03 ... oh, giusto, tipo di funzione o argomenti predefiniti. : P – Xeo