Manchmal benötigen Sie in einem verschachtelten Bereich (Lambda) Typinformationen ohne den Wert. Sie können den Typ (oder den Vorlagenparameter) immer direkt benennen, wenn Sie Zugriff darauf haben, aber es gibt immer die städtische Legende, die besagt, dass Sie den Typ der Variablen nicht ändern müssen, wenn Sie sie eines Tages ändern möchten Ausdrücke, wo Sie es wiederholt haben.
Zum Beispiel:
#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;
}
Hier können Sie immer std::get<T>
anstelle von std::get<decltype(value)>
aber wenn ein Tag make_getter
keine Vorlage mehr ist, und es wird eine normale Funktion für jeden Typen des Tupels als die Art von Wert überlastete würde zum Beispiel zu int
ändern, der Vorteil hier ist, dass decltype(value)
immer funktioniert, vorausgesetzt, Sie benennen die Variable nicht um.
Wie auch immer ich denke, der Nutzen dieser Funktion könnte semantischer als technischer sein. Dieses Verhalten wird wahrscheinlich von der alten Schule kanonischen
geerbt
char *buffer = malloc(42 * sizeof(*buffer));
verwendete in der C
Sprache statt
char *buffer = malloc(42 *sizeof(char));
aus den gleichen Gründen.
Auch wenn der Typ Name etwas unerträglich ist, dass Sie aus irgendeinem Grund nicht Alias werden möchten, gehen Sie die decltype Weg, die nicht unbedingt bedeutet, dass Sie den zugehörigen Wert möchten.
Allgemeiner müssen Sie nur lokale Variablen erfassen, wenn sie * odr-used * sind. Zum Beispiel können Sie den Wert von lokalen 'constexpr'-Variablen wie 'constexpr int x = 42;' verwenden. – dyp
Scheint ziemlich vernünftig für mich, ich hätte nicht gerne Variablen, die ich nicht im Erfassungsbereich zugreifen. –
Was sind die tatsächlichen Anwendungsfälle eines Bausteins? –