Получение типа переменной

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Всем привет! У меня возникла задача, решить которую я не смог. Сюда ли я обратился, то что пишу код в PlatformIO IDE для Arduino Mega? Задача состояла в определении типа переменной в аргументе метода класса. Если, например, аргумент был типом int16_t, то подставлялась бы переменная-член класса такого же типа и аргумент копировался бы в эту переменную. Ну и соответственно с другими типами. Искал в интернете примеры, нашёл решение через typeid:

 

C++Выделить код
1
if (typeid(var) == typeid(int))

но при компиляции выдавало ошибку, что "необходимо включить ключевое слово <typeinfo> перед использованием typeid". Как добавить и куда это слово, пробовал по всякому методом "тыка" результата не дал.

Пробовал подключить файл так, #include <typeinfo.h>, на что мне PlatformIO выдавало ошибку невозможности найти такой файл. 



Также выскакивает ошибка "cannot use typeid with -fno-rtti"

Кто чем поможет...?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

забудь про typeid на этой платформе. 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Не знаю насчёт typeid, но во всех встреченных мною библиотеках, для этого используются разные функции.
Т.е. отдельная функция для int, отдельная для byte и тд
Программа сама смотрит тип данных и вызывает нужную функцию.

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

DetSimen пишет:

забудь про typeid на этой платформе. 

Ну а чем тогда проверять тип?

 

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Kakmyc пишет:
Не знаю насчёт typeid, но во всех встреченных мною библиотеках, для этого используются разные функции. Т.е. отдельная функция для int, отдельная для byte и тд Программа сама смотрит тип данных и вызывает нужную функцию.

Что за разные функции, подскажи.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

AlexBajdin59rus пишет:

Ну а чем тогда проверять тип?

Не тупи. Ты примерно представляешь себе, что такое RTTI?  Если нет, то загугли, а потом спроси себя, как это втиснуть в контроллер.  

b707
Offline
Зарегистрирован: 26.05.2017

AlexBajdin59rus пишет:

Kakmyc пишет:
Не знаю насчёт typeid, но во всех встреченных мною библиотеках, для этого используются разные функции. Т.е. отдельная функция для int, отдельная для byte и тд Программа сама смотрит тип данных и вызывает нужную функцию.

Что за разные функции, подскажи.

 

это называется "перегрузка методов". Читайте в любом учебнике по С/С++

Если коротко - то для каждого возможного типа аргумента ты пишешь отдельный метод класса с одним и тем же названием. А компилятор при компиляции выберет нужный в зависмости от типа аргумента

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

AlexBajdin59rus пишет:

Что за разные функции, подскажи.

используй шаблоны, Люк.

b707
Offline
Зарегистрирован: 26.05.2017

Пример

int subtract(int a, int b)
{
    return a - b;
}
float subtract(float a, float b)
{
    return a - b;
}

void setup() {
int i_a =2;
int i_b = 1;
float f_a = 2.001;
float f_b = 1.001;

substract(i_a, i_b);

substract(f_a, f_b);
}

в строке 16 вызовется первая функция, потому что аргументы целые, а в строке 18 - вторая

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AlexBajdin59rus пишет:

DetSimen пишет:

забудь про typeid на этой платформе. 

Ну а чем тогда проверять тип?

 

А его и не нужно проверять.

По крайней мере, в процессе выполнения.

А в процессе компиляции - пусть проверяет компилятор.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Вот тут еще можно почитать. В том числе про разрешение перегрузки аргументами близких типов.

https://habr.com/ru/post/487920/

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Rumata пишет:

Вот тут еще можно почитать. В том числе про разрешение перегрузки аргументами близких типов.

https://habr.com/ru/post/487920/

Лучше тут:
https://ravesli.com/urok-102-peregruzka-funktsij/

По вашей ссылке описано для тех, кто уже в этом не нуждается

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Спасибо, товарищи, за направление моих действий. буду пробовать.