Ответ 1
Вы можете использовать оператор typeid:
#include <typeinfo>
...
cout << typeid(variable).name() << endl;
В С++, как найти тип переменной?
Вы можете использовать оператор typeid:
#include <typeinfo>
...
cout << typeid(variable).name() << endl;
Для статических утверждений в С++ 11 введен decltype
что весьма полезно в определенных сценариях.
Если у вас есть переменная
int k;
Вы можете получить его тип, используя
cout << typeid(k).name() << endl;
См. следующий поток на SO: Подобный вопрос
Обычно, поиск типа переменной в С++ - неправильный вопрос. Это, как правило, то, что вы несете с процедурных языков, например, C или Pascal.
Если вы хотите кодировать разные типы поведения в зависимости от типа, попробуйте узнать, например. перегрузка функций и наследование объектов. Это не будет иметь непосредственного смысла в первый день работы на С++, но держитесь за него.
Основное отличие между С++ и Javascript заключается в том, что С++ является языком с типизированным типом, wile javascript является динамическим.
В динамически типизированных языках переменная может содержать любую вещь, а ее тип задается значением, которое она имеет, момент за моментом. В статических типизированных языках тип переменной объявляется и не может быть изменен.
Там может быть динамическая компоновка отправки и объекта, а также подтипирование (наследование и виртуальные функции), а также статические рассылки и супертипирование (через шаблон CRTP), но в любом случае тип переменной должен быть известен компилятору.
Если вы в состоянии не знать, что это такое или может быть, это потому, что вы что-то разработали, поскольку язык имеет динамическую систему типов.
Если в этом случае вам лучше подумать о своем дизайне, поскольку он попадает в землю, которая не является естественной для используемого вами языка (больше всего, например, на автостраде с гусеницей или в воде с автомобилем )
Я полагаю, что у меня есть допустимый прецедент для использования typeid(), так же, как это справедливо для использования sizeof(). Для функции шаблона мне нужен специальный код, основанный на переменной шаблона, поэтому я предлагаю максимальную функциональность и гибкость.
Он намного компактнее и удобнее, чем использование полиморфизма, чтобы создать один экземпляр функции для каждого поддерживаемого типа. Даже в этом случае я мог бы использовать этот трюк, чтобы написать тело функции только один раз:
Обратите внимание, что, поскольку код использует шаблоны, оператор switch ниже должен статически ставиться только в один блок кода, оптимизируя все ложные случаи, AFAIK.
Рассмотрим этот пример, где нам может понадобиться обработать преобразование, если T - один тип vs другой. Я использую его для специализации класса для доступа к оборудованию, где аппаратное обеспечение будет использовать либо myClassA, либо myClassB. При несоответствии мне нужно потратить время на преобразование данных.
switch ((typeid(T)) {
case typeid(myClassA):
// handle that case
break;
case typeid(myClassB):
// handle that case
break;
case typeid(uint32_t):
// handle that case
break;
default:
// handle that case
}
Я не уверен, поможет ли мой ответ.
Короткий ответ: вам не нужно/не нужно знать тип переменной, чтобы использовать ее.
Если вам нужно дать тип статической переменной, тогда вы можете просто использовать auto.
В более сложном случае, когда вы хотите использовать "auto" в классе или структуре, я бы предложил использовать шаблон с decltype.
Например, предположим, что вы используете чужую библиотеку, в которой есть переменная unknown_var, и вы хотите поместить ее в вектор или структуру, вы можете сделать это полностью:
template <typename T>
struct my_struct {
int some_field;
T my_data;
};
vector<decltype(unknown_var)> complex_vector;
vector<my_struct<decltype(unknown_var)> > simple_vector
Надеюсь это поможет.
РЕДАКТИРОВАТЬ: Для удобства, вот самый сложный случай, о котором я могу подумать: наличие глобальной переменной неизвестного типа. В этом случае вам понадобится С++ 14 и переменная шаблона.
Что-то вроде этого:
template<typename T> vector<T> global_var;
void random_func (auto unknown_var) {
global_var<decltype(unknown_var)>.push_back(unknown_var);
}
Это все еще немного утомительно, но это так близко, как вы можете добраться до типовых языков. Просто убедитесь, что когда вы ссылаетесь на переменную шаблона, всегда помещайте туда спецификацию шаблона.
#include <typeinfo>
...
string s = typeid(YourClass).name()