【发布时间】:2017-11-09 16:50:56
【问题描述】:
我以为我会对一些排序算法进行基准测试,但我一定是做错了模板:
代码
#include <iostream>
#include <vector>
template <typename ForwardIterator>
void dummysort(ForwardIterator begin_it, ForwardIterator end_it)
{
// pretend to use these and sort stuff
++begin_it;
++end_it;
}
template<typename SortFunc>
void benchmark(const char* name, SortFunc sort_func, std::vector<int> v)
{
std::cout << name << std::endl;
sort_func(v.begin(), v.end());
}
int main()
{
std::vector<int> first = {3, 2, 1};
benchmark("bubblesort", dummysort, first);
}
错误
10:48 $ clang -std=c++14 tmp.cpp
tmp.cpp:30:5: error: no matching function for call to 'benchmark'
benchmark("bubblesort", dummysort, first);
^~~~~~~~~
tmp.cpp:20:6: note: candidate template ignored: couldn't infer template argument 'SortFunc'
void benchmark(const char* name, SortFunc sort_func, std::vector<int> v)
^
1 error generated.
编译器信息
10:47 $ clang --version
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/
如果我“取消模板化”dummysort,它会起作用。
void dummysort(std::vector<int>::iterator begin_it, std::vector<int>::iterator end_it)
问题
有什么方法可以让它通用,或者,如果没有,有人可以给我一个很好的解释或类似于this answer的思想实验吗?
【问题讨论】:
-
不能传递模板,只能传递函数。你应该可以写
benchmark("bubblesort", &dummysort<int>, first);。如果您希望推断出int,您也可以通过编写一个根据类型为您提供正确重载的包装器来做到这一点。 -
@nwp 所以我不能编写一个基准,它采用与 std::sort 兼容的参数的通用排序函数?
-
@nwp - 你是说
&dummysort<std::vector<int>::iterator>吗? -
@Ben - 考虑一下,在 C++ 中,模板函数不是函数:是构造函数的秘诀;当您传递
dummisort时,您传递的是配方,而不是函数;如果你想传递一个函数,你必须明确类型(如 nwp 所建议的那样);但还有另一种方法......我会尝试写一个例子并准备一个答案。 -
@max66 是的,这更有意义。
标签: c++ templates c++14 template-meta-programming