Универсальный указатель на функцию C++

Рейтинг: 0Ответов: 1Опубликовано: 10.02.2023

Вопрос заключается в следующем: требуется создать класс, содержащий два поля: строку и указатель на функцию. Строка не требует пояснений. Проблемы вызывает указатель: нужно создать объекты данного класса и сделать так, чтобы каждый объект вызывал разные функции. При чем у функций могут отличаться сигнатуры (принимаемые, возвращаемые значения). Но в объектах класса поля будут одинаковыми. Поэтому требуется реализовать "универсальный указатель", который мог бы вызывать различные функции (присвоение адреса функции происходит в конструкторе). А также возникает вопрос по поводу вызова этих функций - каким образом в них передавать параметры, если они вызываются через метод класса? Заранее спасибо за ответ.

Ответы

▲ -1Принят

Если знаете, что именно вызываете (аргументы и тип возвращаемого значения), то в принципе, как-то так:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


using namespace std; // да, это все же С++ код, по крайней мере g++ считает его своим

typedef void * (*fany)(...);

int
main (int ac, char *av[])
{
  fany foo = (fany)open,
    bar = (fany)perror;
  char *path = av[1] ? av[1] : (char *)"ttt.cpp";
  int fd = (ssize_t)foo(path, O_RDONLY);

  if (fd == -1) 
    exit((bar(path), 1));

  char buf[1025];
  int l;

  foo = (fany)read;
  bar = (fany)write;
  while ((l = (ssize_t)foo(fd, buf, 1024)) > 0)
    buf[l] = 0, bar(1, buf, l);
  
  return 0;
}

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

В классы, надеюсь, сами сможете по аналогии вставить.