NOT C++模板中的模板方法.
所以,假设您想要使用不同的算法进行搜索 - 例如线性和二进制.而且您还希望通过一些常见例程运行这些搜索,以便您可以自动记录给定搜索所花费的时间等等.
模板方法模式很好地填补了账单.唯一的问题是,就我已经设法挖掘而言,你无法通过C++的静态方法实际实现这种行为,因为你还需要使方法成为虚拟(?)当然有点一个无赖,因为我没有任何需要改变搜索对象的状态.我只想将所有搜索内容固定到自己的命名空间.
所以问题是: 是否需要使用类似函数/方法指针的东西?或者只是使用命名空间来完成这项工作?
我很难忍受C++的这种(我敢说的)限制,因为像这样的东西对Java来说是轻而易举的.
编辑:
哦,是的,因为这是一个学校作业,使用外部库(STL除外)并不是一个真正的选择.对不起,麻烦.
我不明白你为什么需要模板方法模式.
为什么不将这些算法定义为可以传递给基准函数的仿函数?
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)
最后,值得一提的是,这两种方法都应该带来零开销.与涉及虚函数的任何东西不同,编译器完全知道在这里调用哪些函数,并且可以并且将内联它们,从而产生与您对每个案例进行手工编码一样高效的代码.