проверить тип элемента в контейнере stl - c ++ - PullRequest
16 голосов
/ 10 ноября 2009

как я могу получить тип элементов, которые содержатся в контейнере STL?

Ответы [ 7 ]

20 голосов
/ 10 ноября 2009
container::value_type
16 голосов
/ 10 ноября 2009

Для контейнеров в целом это будет X::value_type. Для ассоциативных контейнеров это будет X::mapped_type (X::value_type соответствует pair<const Key,T>). Это в соответствии с главой 23 стандарта C ++.

Чтобы проверить, что типы одинаковы, вы можете использовать boost::is_same.

4 голосов
/ 10 ноября 2009

Проверка, являются ли два типа одинаковыми, может быть достигнута следующим образом (без 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, минус обходные пути для некоторых компиляторов.)

0 голосов
/ 10 ноября 2009

учитывая, что типы статически известны, вы можете проверить, что они статически одинаковы, не используя rtti, используя специализацию шаблонов. например используйте что-то вроде http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html или если буст недоступен, бросьте свой собственный

0 голосов
/ 10 ноября 2009

Используйте что-то вроде этого:

if (typeid(yourVariable)==typeid(YourClass)) //...

Alek

0 голосов
/ 10 ноября 2009

Вы должны дать нам больше контекста. Если вы хотите, чтобы значение было известно во время компиляции, поэтому его легко изменить, используйте container::value_type.

typedef vector<int> coordinates;

coordinates seq;
fib::value_type elem = seq.back(); // it's easy to change int type

Если вы имеете в виду, что контейнер может содержать различные конкретные (производные) типы, и вы хотите знать их во время выполнения, то вам, вероятно, следует пересмотреть свой подход. В объектно-ориентированном программировании скрытие типа во время выполнения иногда является мощным подходом, потому что это означает, что вы делаете меньше предположений о том, с чем работаете. Конечно, вы можете использовать RTTI, но, возможно, есть лучший способ: нам нужно больше контекста, чтобы рассказать.

Если вы хотите сравнить типы, вы, вероятно, направляете путь времени выполнения. C ++ поддерживает полиморфизм, который, по сути, является тем типом сравнения типов, который вы ищете, но встроен в язык. Вы хотите выполнить другой набор инструкций в зависимости от типа? Полиморфизм позволяет выполнять другую функцию в зависимости от типа объекта. Вам не нужно писать ни одной дополнительной строки кода - только производные от общей базы.

0 голосов
/ 10 ноября 2009

В каком смысле? Может быть, используя RTTI и typeid ()?

Возможно, вам нужно использовать container :: valuetype, где container - это имя вашего контейнера (например, std :: vector)

Alek

...