A volte in uno scope nidificato (lambda) è necessario digitare le informazioni senza il valore. Puoi sempre dare un nome al tipo (o al parametro del modello) direttamente se hai accesso ad esso, ma c'è sempre quella leggenda metropolitana un buon consiglio che dice che se un giorno cambi il tipo di variabile non dovrai cambiarlo in tutte le altre espressioni in cui lo hai ripetuto.
Ad esempio:
#include <iostream>
#include <tuple>
#include <utility>
class storage
{
public:
template<typename T>
auto make_getter(T value)
{
std::get<decltype(value)>(storage_) = value;
auto getter = [this]
{
return std::get<decltype(value)>(storage_);
};
return getter;
}
private:
std::tuple<int, char, double> storage_;
};
int main(void)
{
storage s;
auto getter = s.make_getter(42);
std::cout << getter() << std::endl;
}
Qui si può sempre utilizzare std::get<T>
invece di std::get<decltype(value)>
ma se un giorno make_getter
non è un modello più e diventa una funzione normale sovraccarico per ogni tipo di tupla rispetto al tipo di valore ad esempio, ilfunzionerà sempre se non si rinomina la variabile.
In ogni caso, penso che il livello di utilità di questa funzione potrebbe essere più semantico che tecnico. Questo comportamento è probabilmente ereditata dalla vecchia scuola canonica
char *buffer = malloc(42 * sizeof(*buffer));
utilizzato nel C
lingua invece di
char *buffer = malloc(42 *sizeof(char));
per le stesse ragioni.
Anche se il nome del tipo è qualcosa di insopportabile che non si desidera l'alias per qualche motivo si va in decltype che non significa necessariamente che si desidera il valore associato.
Più in generale, è necessario acquisire le variabili locali solo se sono * odr-used *. Ad esempio, puoi usare il valore delle variabili locali 'constexpr' come' constexpr int x = 42; '. – dyp
Sembra abbastanza ragionevole per me, non vorrei avere variabili che non accedo allo scope capture. –
Quali sono i reali casi d'uso di un mattone da costruzione? –