Проверить тип элемента в контейнере 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 не доступен, переверните свой собственный