Jak mogę uzyskać typ elementów, które są przechowywane przez kontener STL?sprawdź typ elementu w pojemniku STL - C++
Odpowiedz
przypadku pojemników w ogóle będzie to X::value_type
. W przypadku pojemników asocjacyjnych będzie to X::mapped_type
(X::value_type
odpowiada pair<const Key,T>
). Jest to zgodne z Rozdziałem 23 Standardu C++.
Aby sprawdzić, że typy są równe, można użyć boost::is_same
.
container::value_type
dobrze, ale już nie mogę porównać dwóch typów wartości zwracanych przez container :: value_type. jakieś sugestie? –
@Patrick: nie można porównać wartości "zwróconych przez value_type", ponieważ value_type jest typem, a nie wartością. Porównanie dwóch typów wartości jest więc operacją statyczną, a nie runtime. W zależności od tego, co próbujesz osiągnąć, możesz zajrzeć do "is_same" w Boost.TypeTraits: http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference /is_same.html –
@Patrick: Pytasz o * typ * elementów przechowywanych w wektorze, a nie * wartość * elementów. Możesz porównywać wartości, nie możesz porównywać typów (przynajmniej nie bez wielu trików do metaprogramowania) - może powinieneś wyjaśnić, co próbujesz zrobić. – jalf
W jakim sensie? Być może używając RTTI i typeid()?
Prawdopodobnie trzeba użyć kontenera :: ValueType gdzie pojemnik to nazwa kontenera (np std :: vector)
Alek
Musisz podać nam więcej kontekstu. Jeśli chcesz, aby wartość była znana podczas kompilacji, więc łatwo ją zmienić, a następnie użyj container::value_type
.
typedef vector<int> coordinates;
coordinates seq;
fib::value_type elem = seq.back(); // it's easy to change int type
Jeśli co masz na myśli to, że pojemnik może posiadać różne konkretne typy (pochodne) i chcesz je poznać w czasie wykonywania następnie należy prawdopodobnie ponownie ocenić swoje podejście. W ukrytym programowaniu ukrywanie typu w środowisku wykonawczym jest czasem potężnym podejściem, ponieważ oznacza mniej założeń na temat tego, z czym pracujesz. Możesz oczywiście użyć RTTI, ale prawdopodobnie jest lepszy sposób: potrzebowalibyśmy więcej kontekstu, żeby to powiedzieć.
Jeśli chcesz porównać typy, prawdopodobnie wybierasz ścieżkę środowiska wykonawczego. C++ wspiera polimorfizm, który jest w istocie porównywaniem typów, którymi się opiekujesz - ale wbudowany w język. Chcesz wykonać inny zestaw instrukcji na podstawie typu? Polimorfizm pozwala na wykonanie innej funkcji w zależności od typu obiektu. Nie musisz pisać żadnej dodatkowej linii kodu - pochodzą tylko ze wspólnej bazy.
użyć czegoś takiego:
if (typeid(yourVariable)==typeid(YourClass)) //...
Alek
lub dynamic_cast <> jeśli chcesz przetestować łańcuch dziedziczenia;) –
, ale tylko jeśli twój typ ma metody wirtualne. –
dynamic_cast jest używany na wskaźnikach polimorficznych oczywiście. Nie wspominałem o tym. Masz rację. Dzięki za wskazanie;) –
podane typy są znane statycznie można sprawdzić, że są takie same statycznie bez użycia RTTI za pomocą szablonu specjalizacji. na przykład używać coś jak http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html lub jeśli impuls nie jest dostępny przewróceniu własne
Sprawdzanie, czy dwa typy to samo można osiągnąć w ten sposób (bez RTTI, wartość jest użyteczny w czasie kompilacji):
template <class T, class U>
struct same_type
{
static const bool value = false;
};
//specialization for types that are the same
template <class T>
struct same_type<T, T>
{
static const bool value = true;
};
//sample usage:
template <class FirstContainer, class SecondContainer>
bool containers_of_same_type(const FirstContainer&, const SecondContainer&)
{
return same_type<
typename FirstContainer::value_type,
typename SecondContainer::value_type
>::value;
}
#include <vector>
#include <list>
#include <iostream>
int main()
{
std::cout << containers_of_same_type(std::vector<int>(), std::list<int>());
std::cout << containers_of_same_type(std::vector<char>(), std::list<int>());
}
(Zasadniczo działa to w trybie boost::is_same
, pomijając obejścia niektórych kompilatorów.)
Wow, to bardzo sprytne –
- 1. C++ zwięzłe sprawdzanie, czy element w pojemniku STL (np. Wektor)
- 2. Funkcja członka wywołania dla każdego elementu w pojemniku
- 3. Znajdowanie elementu w pojemniku shared_ptr?
- 4. Alokacja pamięci w STL C++
- 5. lista Move elementu do końca w STL
- 6. Standardowy kontener C++ i kontener STL w C++
- 7. Szukasz wektora C++ STL wewnątrz wektora STL
- 8. Sprawdź typ zmiennej w FreeMarker
- 9. Obcinanie łańcuchów stl w C++
- 10. C++ kontenery STL
- 11. C++ stl convolution
- 12. Znajdź typ elementu w bieżącej pozycji w oknie edytora C#
- 13. sprawdź framework elementu ograniczenia
- 14. Sprawdź, czy typ obiektów dziedziczy abstrakcyjny typ
- 15. Typ indeksu tablicy w C#?
- 16. Sprawdź typ obiektu ios swift
- 17. XDocument.Validate - Oczekiwany typ Typ elementu błędu
- 18. Sprawdź, czy typ jest słownik
- 19. Sprawdź, czy typ to interfejs
- 20. Java datastructures/odpowiedniki C++ STL?
- 21. Powtarzanie dwuwymiarowego wektora STL C++
- 22. XDummy w pojemniku Docker
- 23. C++ STL pop_heap nie działa
- 24. Mapowanie między kontenerami stl C++ i C#
- 25. Porównanie kolekcji C++ STL i kolekcji C#?
- 26. Deterministyczne strumienie liczb losowych w C++ STL
- 27. Rozwiązywanie problemów w C++ ze STL
- 28. Debugowanie kontenerów C++ STL w Windbg
- 29. Jak połączyć STL w kod C++?
- 30. C++ sprawdź zagnieżdżony typedef parametru szablonu, aby uzyskać jego bazowy typ skalarny
Dokładnie, co próbujesz tutaj zrobić? Ponieważ C++ jest statycznie wpisane, powinieneś ogólnie wiedzieć, jakiego typu są te elementy (wektor, na przykład, posiada ints). Jeśli chcesz wyjaśnić, dlaczego nie wiesz, jakie są typy i do czego chcesz ich użyć, to pomożesz odpowiedzieć na pytanie. –
@ David Thornley: 'template void foo (std :: template arg) {/ * Tutaj nie wiemy, jaki jest typ elementów * /}' Myślę, że to dość powszechna sytuacja. –
jalf
@Jalf: W tym momencie prawda. Ale w tym momencie foo() jest tylko pojęciem. Ale gdy tylko użyjesz foo(), również znasz typ. –