Проверить тип элемента в контейнере stl - С++
как я могу получить тип элементов, которые хранятся в контейнере STL?
Ответы
Ответ 1
Для контейнеров в целом это будет X::value_type
. Для ассоциативных контейнеров это будет X::mapped_type
(X::value_type
соответствует pair<const Key,T>
). Это согласно главе 23 Стандарта С++.
Чтобы проверить, что типы равны, вы можете использовать boost::is_same
.
Ответ 2
container::value_type
Ответ 3
Проверка того, могут ли быть одинаковы два типа (без RTTI, значение можно использовать во время компиляции):
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>());
}
(В основном это работает boost::is_same
, минус обходные пути для некоторых компиляторов.)
Ответ 4
В каком смысле?
Возможно, используя RTTI и typeid()?
Вероятно, вам нужно использовать container:: valuetype, где container - это имя вашего контейнера (например, std::vector)
Alek
Ответ 5
Вам нужно дать нам больше контекста. Если вы хотите, чтобы значение было известно в compiletime, поэтому его легко изменить, используйте container::value_type
.
typedef vector<int> coordinates;
coordinates seq;
fib::value_type elem = seq.back(); // it easy to change int type
Если вы имеете в виду, что контейнер может содержать различные конкретные (производные) типы, и вы хотите знать их во время выполнения, то вы, вероятно, должны переоценить свой подход. В объектно-ориентированном программировании скрытие типа во время выполнения иногда является мощным подходом, потому что это означает, что вы делаете меньше предположений о том, с чем работаете. Конечно, вы можете использовать RTTI, но, вероятно, лучший способ: нам нужно больше контекста, чтобы рассказать.
Если вы хотите сравнить типы, вы, вероятно, возглавляете путь выполнения. С++ поддерживает полиморфизм, который по существу является тем типом сравнения, за которым вы заботитесь, но встроенным в язык. Вы хотите выполнить другой набор инструкций на основе типа? Полиморфизм позволяет выполнять другую функцию, основанную на типе объекта. Вам не нужно писать одну дополнительную строку кода - только из общей базы.
Ответ 6
Используйте что-то вроде этого:
if (typeid(yourVariable)==typeid(YourClass)) //...
Alek
Ответ 7
учитывая, что типы известны статически, вы можете проверить, что они одинаковы статически, не используя rtti, используя специализированную специализацию. например используйте что-то вроде http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html или если boost не доступен, переверните свой собственный