Я хотел бы, чтобы класс реализовывал 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) ()'