C++ w /静态模板方法

JHo*_*nti 0 c++

NOT C++模板中的模板方法.

所以,假设您想要使用不同的算法进行搜索 - 例如线性和二进制.而且您还希望通过一些常见例程运行这些搜索,以便您可以自动记录给定搜索所花费的时间等等.

模板方法模式很好地填补了账单.唯一的问题是,就我已经设法挖掘而言,你无法通过C++的静态方法实际实现这种行为,因为你还需要使方法成为虚拟(?)当然有点一个无赖,因为我没有任何需要改变搜索对象的状态.我只想将所有搜索内容固定到自己的命名空间.

所以问题是: 是否需要使用类似函数/方法指针的东西?或者只是使用命名空间来完成这项工作?

我很难忍受C++的这种(我敢说的)限制,因为像这样的东西对Java来说是轻而易举的.

编辑:

哦,是的,因为这是一个学校作业,使用外部库(STL除外)并不是一个真正的选择.对不起,麻烦.

jal*_*alf 5

我不明白你为什么需要模板方法模式.

为什么不将这些算法定义为可以传递给基准函数的仿函数?

struct BinarySearch { // functor implementing a specific search algorithm
  template <typename iter_type>
  void operator()(iter_type first, iter_type last){ ....}
};

template <typename data_type, typename search_type>
void BenchmarkSearch(data_type& data, search_type search){ // general benchmarking/bookkeeping function
// init timer
search(data);
// compute elapsed time
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

int main(){
  std::vector<int> vec;
  vec.push_back(43);
  vec.push_back(2);
  vec.push_back(8);
  vec.push_back(13);

  BenchmarkSearch(vec, BinarySearch());
  BenchmarkSearch(vec, LinearSearch()); // assuming more search algorithms are defined
  BenchmarkSearch(vec, SomeOtherSearch();
}
Run Code Online (Sandbox Code Playgroud)

当然,另一种更接近你最初想要的方法可能是使用CRTP(一种非常聪明的模式,用于在编译时模拟虚函数 - 它也适用于静态方法):

template <typename T>
struct SearchBase { // base class implementing general bookkeeping
  static void Search() {
    // do general bookkeeping, initialize timers, whatever you need
    T::Search(); // Call derived search function
    // Wrap up, do whatever bookkeeping is left
  }
}


struct LinearSearch : SearchBase<LinearSearch> // derived class implementing the specific search algorithms
{
  static void Search(){
    // Perform the actual search
  }
};
Run Code Online (Sandbox Code Playgroud)

然后你可以调用静态函数:

SearchBase<LinearSearch>::Search();
SearchBase<BinarySearch>::Search();
SearchBase<SomeOtherSearch>::Search();
Run Code Online (Sandbox Code Playgroud)

最后,值得一提的是,这两种方法都应该带来零开销.与涉及虚函数的任何东西不同,编译器完全知道在这里调用哪些函数,并且可以并且将内联它们,从而产生与您对每个案例进行手工编码一样高效的代码.