模板作为C++中虚函数的替代

Joe*_*oel 1 c++

我在基类中定义了一个昂贵的函数,它依赖于派生类的低级信息:

class BaseClass{
 ...
 // Defined in derived class
 virtual int low_level(int)=0;

 // Expensive function depending on the pure virtual function
 void myExpensiveFunction(){
   for(...){
     for(...){
       for(...){
         ... = low_level(...);
         ...
       }
     }
   }
 }
};

class DerivedClass : public BaseClass{
   // A very cheap operation that can be inlined:
   inline virtual int low_level(int i){
     return a[i];
   }

   // Calling the base class function
   void test(){
     myExpensiveFunction();
   }
};
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,那么低级函数是虚拟的这一事实可以防止它在上面的代码中被内联.现在,我正在考虑一种解决此问题的方法并考虑以下解决方案,其中我将指向派生类成员函数的指针作为模板参数传递:

class BaseClass{
 ...
 // The function is now templated by the derived function:
 template<typename D, int (D::*low_level)(int)>
 void myExpensiveFunction(){
   for(...){
     for(...){
       for(...){
         ... = static_cast<D*>(this)->low_level(...);
         ...
       }
     }
   }
 }
};

class DerivedClass : public BaseClass{
   // A very cheap operation that can be inlined:
   inline int low_level(int i){
     return a[i];
   }

   // Calling the base class function
   void test(){
     myExpensiveFunction<DerivedClass,&DerivedClass::low_level>();
   }
};
Run Code Online (Sandbox Code Playgroud)

这种策略有意义吗?我想,当在派生类中扩展昂贵的基类函数时,将内联低级操作.

我测试了它的实现并编译和工作,但我没有看到任何明显的性能差异.

亲切的问候,乔尔

Die*_*ühl 5

使用指向成员的指针将要调用的函数传递给基类并没有真正改进使用虚函数.事实上,我希望它会使情况变得更糟.另一种方法是使用带有inline函数调用操作符的函数对象并调用它."正常"方法是反转类层次结构并使用奇怪的重复模板模式:想法是创建一个模板,该模板将从其模板参数派生.模板参数应该提供自定义点,例如函数low_level.