jeśli mam szablon:przechowywanie i ponowne używanie wartości decltype?
template <class T>
struct Item
{
T _value;
};
mogę wtedy zrobić:
// ...
Item<int> x = { 42 }; // declared as an int
// ...
decltype(x._value) y = 20; // 'y' is also an int
Ale czy jest to możliwe do przechowywania decltype
do zmiennej, dzięki czemu można go stosować później?
Dlaczego?
Chcę przechowywać wartości elementów jako wskaźnik.
Coś std::vector<Item*>
ale jak są szablony muszę przechowywać je jako wskazówki do void
:
std::vector<void*> is;
is.push_back(new Item<int>());
is.push_back(new Item<double>());
is.push_back(new Item<float>());
I to wszystko jest w porządku, ale gdy przychodzi czas, aby usunąć wskaźnik muszę ponownie obsady moja void*
z powrotem do właściwego typu (tak nazywane są destruktory):
delete (Item<int>*)is[0];
A jeśli wiem, typ, mogę zrobić:
delete (Item<decltype(whatever)>*)is[0];
Z tego powodu muszę przechowywać decltype
.
Mam nadzieję, że to ma sens.
Powinieneś sprawdzić Boost.variant i Boost.any (lub ich odpowiedniki C++ 17 [ 'std :: variant'] (http: // pl. cppreference.com/w/cpp/utility/variant) i ['std :: any'] (http://en.cppreference.com/w/cpp/utility/any)). Są prawdopodobnie lepszymi implementacjami tego, czego potrzebujesz. –
Typ wymazania jest słowem kluczowym, w C jest wykonywane z 'void *', w C++ jest wykonywane z 'std :: any' oraz wzorem gościa. Rozwiązania inteligentnych wskaźników używają wewnętrznie pewnego rodzaju usuwania typów. – alfC
@alfC Zauważ, że wymazywanie typów odbywa się w czasie kompilacji, podczas gdy podstawową ideą systemu odwiedzającego jest podwójna wysyłka, czyli mechanizm wykonawczy. – skypjack