Czasami w zakresie zagnieżdżonym (lambda) potrzebujesz informacji o typie bez wartości. Zawsze możesz nazwać typ (lub parametr szablonu) bezpośrednio, jeśli masz do niego dostęp, ale zawsze jest taka miejska legenda dobra rada, mówiąc, że jeśli pewnego dnia zmienisz typ zmiennej, nie będziesz musiał jej zmieniać we wszystkich innych wyrażenia, w których je powtórzyłeś.
Na przykład:
#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;
}
Tutaj można zawsze wykorzystać std::get<T>
zamiast std::get<decltype(value)>
ale jeśli kiedyś make_getter
nie jest szablonem więcej i staje się to normalna funkcja przeciążenia dla każdego rodzaju krotki niż typ wartości zmieniłoby się na int
na przykład, zaletą jest to, że decltype(value)
zawsze będzie działać pod warunkiem, że nie zmienisz nazwy zmiennej.
W każdym razie uważam, że poziom użyteczności tej funkcji może być bardziej semantyczny niż techniczny. Takie zachowanie jest prawdopodobnie odziedziczone po starej szkole kanonicznej
char *buffer = malloc(42 * sizeof(*buffer));
stosowanego w języku zamiast
char *buffer = malloc(42 *sizeof(char));
z tych samych powodów C
.
Również jeśli nazwa typu jest czymś nie do zniesienia, że z jakiegoś powodu nie chcesz używać aliasu, przejdziesz do stylu decltype, co niekoniecznie oznacza, że chcesz uzyskać powiązaną wartość.
Mówiąc bardziej ogólnie, wystarczy przechwycić zmienne lokalne, jeśli są one * odr-używane *. Na przykład możesz użyć wartości lokalnych zmiennych 'constexpr', takich jak' constexpr int x = 42; '. – dyp
Wydaje mi się całkiem rozsądny, nie chciałbym mieć zmiennych, do których nie mam dostępu w zakresie przechwytywania. –
Jakie są faktyczne przypadki użycia cegły budowlanej? –