Передача в функцию и возврат данных произвольного типа

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

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов