Два важных операторов типа манипуляции TypeId и decltype.
typeid вернуть объект type_info с информацией о типе.
Некоторые способы проверяют типов:
- станд :: is_same
- TypeId
- перегрузки Функция
Если вы используете C++ 11 лучший вариант должен быть станд :: is_same с дельта-типом (определяет тип переменной), потому что это временное разрешение компиляции.
vector<int> integers;
vector<double> doubles;
cout << is_same<vector<int>, decltype(integers)>::value << endl;
cout << is_same<vector<int>, decltype(doubles)>::value << endl;
cout << is_same<vector<double>, decltype(integers)>::value << endl;
cout << is_same<vector<double>, decltype(doubles)>::value << endl;
Если вы используете стандартный C++ (C++ 98), вы можете использовать оператор TypeID
vector<int> vectorInt;
vector<int> integers;
vector<double> doubles;
cout << (typeid(integers) == typeid(vectorInt)) << endl;
cout << (typeid(doubles) == typeid(vectorInt)) << endl;
Вы можете использовать перегрузку и шаблоны функций, чтобы решить эту проблему типов без неожиданного сломалась.
На этом пути вам нужно написать функцию для каждого типа для идентификации или функция шаблона вернет -1 (неизвестно), как идентификация.
template<typename T>
int getTypeId(T) {
return -1;
}
int getTypeId(vector<int>) {
return 1;
}
main() {
vector<int> integers;
vector<double> doubles;
vector<char> chars;
cout << getTypeId(integers) << endl;
cout << getTypeId(doubles) << endl;
cout << getTypeId(chars) << endl;
}
Да, перегрузка –
Похоже, вы пытаетесь включить типы. У вас, вероятно, есть недостаток дизайна. –
@BaummitAugen Итак, специализация шаблонов и перегрузка функций ошибочны по дизайну? Существуют вполне обоснованные причины для включения типов, особенно если вы используете механизмы отправки, предоставляемые языком, а не if-else. – TheOperator