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