我想基于类中的选项设置一个类实现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: error: declaration of ‘operator()’ as non-function
test.cxx: In member function ‘void Test::SetIt(int)’:
test.cxx:17:16: error: ‘operator()’ not defined
test.cxx:19:16: error: ‘operator()’ not defined
test.cxx: In function ‘int main()’:
test.cxx:30:19: error: no match for call to ‘(Test) ()’
test.cxx:34:19: error: no match for call to ‘(Test) ()’
解决方法
你的类需要以某种方式记住要使用的函数指针.将其存储为类成员:
class Test { public: Test() : func(0) {} int operator()() { // Note that pointers to Test member functions need a pointer to Test to work. return (this->*func)(); // undefined behavior if func == 0 } void SetIt(int i) { if(i == 1) { func = &Test::DoIt1; } else { func = &Test::DoIt2; } } private: int DoIt1() { return 1; } int DoIt2() { return 2; } // Typedef of a pointer to a class method. typedef int (Test::*FuncPtr)(); FuncPtr func; };
但是,在您努力完成此操作之前,首先要对代码进行分析,然后查看是否通过switch进行分支,或者是否实际上是瓶颈(可能不是!).现代处理器具有非常违反直觉的性能特征,因此编译器可能能够生成比您想象的更好的代码.确保分支实际上太昂贵而无法使用的唯一方法是分析代码. (并且通过“剖析”我的意思是“运行设计良好的实验”,而不是“在没有测试的情况下提出预感”.)