Оператор как указатель на функцию

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

#include <iostream>

class Test {
public:
  int (*operator())();

  int DoIt1() {
    return 1;
  }

  int DoIt2() {
    return 2;
  }

  void SetIt(int i) {
    if(i == 1) {
      operator() = &Test::DoIt1;
    } else {
      operator() = &Test::DoIt2;
    }
  }
};

int main()
{
  Test t1;

  t1.SetIt(1);

  std::cout << t1() << std::endl;

  t1.SetIt(2);

  std::cout << t1() << std::endl;

  return 0;
}

Я знаю, что это сработает, если я создам еще один указатель на функцию и вызову его из функции operator(). Но возможно ли, чтобы сама функция operator()была указателем на функцию? Что-то вроде того, что я опубликовал (что не компилируется)?

Вышеприведенный код дает:

test.cxx:5:21: ошибка: объявление 'operator()' как не функции

test.cxx: В функции-члене 'void Test::SetIt(int )':

test.cxx:17:16: ошибка: 'operator()' не определена

test.cxx:19:16: ошибка: 'operator()' не определена

test.cxx: В функции 'int main()':

test.cxx:30:19: ошибка: нет совпадения для вызова '(Test) ()'

test.cxx:34:19: ошибка: нет совпадения для вызов '(Test) ()'

7
задан tpg2114 20 April 2012 в 04:32
поделиться