Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Передача в функцию и возврат данных произвольного типа
Если в функцию нужно передать данные произвольного типа или вернуть данные произвольного типа, то следует использовать указатели с типом void *
. Пример объявления указателя:
void *p = nullptr;
Присвоить адрес указателю можно как обычно:
int x = 10;
p = &x;
Чтобы получить значение нужно привести указатель к определенному типу, а затем выполнить разыменование указателя:
std::cout << *(static_cast<int*>(p)) << std::endl; // 10
Не типизированный указатель можно присвоить типизированному. В этом случае в языке C приведение типа выполняется автоматически, а в языке C++ следует выполнить приведение явным образом:
int *px = static_cast<int*>(p);
std::cout << *px << std::endl; // 10
Мы можем сохранить в указателе данные любого типа, но чтобы получить данные, нужно знать к какому типу выполнить приведение. Например, сохраним вещественное число, а затем получим его и выведем на консоль:
double y = 20.2123;
p = &y;
std::cout << *(static_cast<double*>(p)) << std::endl; // 20.2123
В качестве примера напишем функцию, позволяющую вывести на консоль данные типов int
, long
, long long
и double
(листинг 12.26).
Листинг 12.26. Передача в функцию данных произвольного типа
#include <iostream>
#include <limits.h>
enum TypeParam {
TINT, TLONG, TLONGLONG, TDOUBLE
};
void println(const char *s, void *p, enum TypeParam t);
int main() {
int x = INT_MAX;
println("x = ", &x, TINT); // x = 2147483647
long y = LONG_MAX;
println("y = ", &y, TLONG); // y = 2147483647
long long z = LLONG_MAX;
println("", &z, TLONGLONG); // 9223372036854775807
double k = 20.2123;
println("k = ", &k, TDOUBLE); // k = 20.2123
return 0;
}
void println(const char *s, void *p, enum TypeParam t) {
if (!p || !s) return;
std::cout << s;
switch (t) {
case TINT:
std::cout << *(static_cast<int*>(p)) << std::endl;
break;
case TLONG:
std::cout << *(static_cast<long*>(p)) << std::endl;
break;
case TLONGLONG:
std::cout << *(static_cast<long long*>(p)) << std::endl;
break;
case TDOUBLE:
std::cout << *(static_cast<double*>(p)) << std::endl;
break;
}
}
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов