массив перегруженных функций в с ++ - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть несколько перегруженных функций в c ++, и я хотел бы сделать их массив, чтобы я мог использовать их в цикле (фактически я хочу вызывать их случайным образом) Не могли бы вы помочь? В руководствах показано только, как создавать массивы указателей на функции с одинаковыми аргументами функции.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Я думаю, что главная проблема здесь в том, что кажется, что вам нужно определить тип и порядок аргументов функции во время выполнения, а не во время компиляции.Какова ваша главная цель здесь?скорость исполнения?читабельность кода или «правильность»?Если вы идете на скорость выполнения, то я думаю, что есть какое-то уродливое решение.Насколько я понимаю вашу проблему, вы решите, какую «перегруженную функцию» вы будете вызывать, используя случайный выбор индекса массива.Поэтому одна не обязательно безопасная возможность - использовать функторы и передавать создателю каждого функтора в массиве указатели на переменные, которые он будет использовать в будущем, как если бы эти переменные были его аргументами.Но это работает, только если вы всегда будете использовать те же переменные, что и аргументы вызовов «function».

0 голосов
/ 23 февраля 2012

Подождите, так что вы хотите вызывать набор перегруженных функций случайным образом?

Почему бы просто не сделать функцию быстрого ранда и затем использовать оператор switch?

Например, допустим, у вас есть3 перегруженные функции:

srand(time(0));
int rand = rand() % 3 // Replace 3 with number of functions.

switch(rand)
{
   case 0:
      test("this is a string!");
      break;
   case 1:
      test(12, 16);
      break;
   case 2:
      test(16.2, 3, "Hello, World!");
      break;
}

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

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

...