проверьте тип элемента в stl контейнере - C++

Мы используем соединительную линию для основной разработки и ответвления для работ по техническому обслуживанию выпусков. Это работает хорошее. Но тогда ответвления должны только использоваться для исправлений ошибок, никаких существенных изменений, особенно на стороне базы данных, у нас есть правило, что только изменение схемы может произойти на основной соединительной линии и никогда в ответвлении.

17
задан Patrick Oscity 10 November 2009 в 15:38
поделиться

7 ответов

Обычно для контейнеров это будет X :: value_type . Для ассоциативных контейнеров это будет X :: mapped_type ( X :: value_type соответствует паре ). Это соответствует главе 23 стандарта C ++.

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

18
ответ дан 30 November 2019 в 11:13
поделиться

Проверить, являются ли два типа одинаковыми, можно следующим образом (без 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
ответ дан 30 November 2019 в 11:13
поделиться
container::value_type
21
ответ дан 30 November 2019 в 11:13
поделиться

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

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

Alek

0
ответ дан 30 November 2019 в 11:13
поделиться

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

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

Alek

0
ответ дан 30 November 2019 в 11:13
поделиться

Вам нужно дать нам больше контекста. Если вы имеете в виду, что хотите, чтобы значение было известно во время компиляции, чтобы его было легко изменить, тогда используйте 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
ответ дан 30 November 2019 в 11:13
поделиться

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

0
ответ дан 30 November 2019 в 11:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: