C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 作为函数指针的运算符大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想基于类中的选项设置一个类实现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()函数本身成为函数指针吗?我发布的东西(不编译)的东西?

上面的代码给出:

解决方法

你的类需要以某种方式记住要使用的函数指针.将其存储为类成员
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进行分支,或者是否实际上是瓶颈(可能不是!).现代处理器具有非常违反直觉的性能特征,因此编译器可能能够生成比您想象的更好的代码.确保分支实际上太昂贵而无法使用的唯一方法是分析代码. (并且通过“剖析”我的意思是“运行设计良好的实验”,而不是“在没有测试的情况下提出预感”.)

大佬总结

以上是大佬教程为你收集整理的c – 作为函数指针的运算符全部内容,希望文章能够帮你解决c – 作为函数指针的运算符所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。