Подтвердить что ты не робот

Как получить тип переменной?

В С++, как найти тип переменной?

4b9b3361

Ответ 1

Вы можете использовать оператор typeid:

#include <typeinfo>
...
cout << typeid(variable).name() << endl;

Ответ 2

Для статических утверждений в С++ 11 введен decltype что весьма полезно в определенных сценариях.

Ответ 3

Если у вас есть переменная

int k;

Вы можете получить его тип, используя

cout << typeid(k).name() << endl;

См. следующий поток на SO: Подобный вопрос

Ответ 4

Обычно, поиск типа переменной в С++ - неправильный вопрос. Это, как правило, то, что вы несете с процедурных языков, например, C или Pascal.

Если вы хотите кодировать разные типы поведения в зависимости от типа, попробуйте узнать, например. перегрузка функций и наследование объектов. Это не будет иметь непосредственного смысла в первый день работы на С++, но держитесь за него.

Ответ 5

Основное отличие между С++ и Javascript заключается в том, что С++ является языком с типизированным типом, wile javascript является динамическим.

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

Там может быть динамическая компоновка отправки и объекта, а также подтипирование (наследование и виртуальные функции), а также статические рассылки и супертипирование (через шаблон CRTP), но в любом случае тип переменной должен быть известен компилятору.

Если вы в состоянии не знать, что это такое или может быть, это потому, что вы что-то разработали, поскольку язык имеет динамическую систему типов.

Если в этом случае вам лучше подумать о своем дизайне, поскольку он попадает в землю, которая не является естественной для используемого вами языка (больше всего, например, на автостраде с гусеницей или в воде с автомобилем )

Ответ 6

Я полагаю, что у меня есть допустимый прецедент для использования 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
}

Ответ 7

Я не уверен, поможет ли мой ответ.

Короткий ответ: вам не нужно/не нужно знать тип переменной, чтобы использовать ее.

Если вам нужно дать тип статической переменной, тогда вы можете просто использовать 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);
}

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

Ответ 8

#include <typeinfo>

...
string s = typeid(YourClass).name()