gpt4 book ai didi

c++ - 模板函数可以作为另一个函数的模板参数吗?

转载 作者:太空狗 更新时间:2023-10-29 20:34:39 24 4
gpt4 key购买 nike

我想我应该对一些排序算法进行基准测试,但我一定是做错了模板:

代码

#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 的思想实验吗? ?

最佳答案

正如 nwp 所解释的,模板函数不是函数;只是构造函数的秘诀。

所以你不能通过食谱

benchmark("bubblesort", dummysort, first);

但是您可以通过说明类型和根据配方构造函数来做到这一点;我是说

benchmark("bubblesort", dummysort<std::vector<int>::iterator>, first);

可以,但我觉得有点丑。

我建议您另一种解决方案:构造一个类(或结构),其中包含模板 operator(),而不是模板函数;像

struct dummySort
{
template <typename FI>
void operator() (FI begin_it, FI end_it)
{
++begin_it;
++end_it;
}
};

通过这种方式,您可以调用 benchmark() 传递此类型的对象,而无需说明迭代器的类型:这是对 benchmark() 内部运算符的调用选择正确的类型并构造正确的运算符。

下面是一个完整的编译示例

#include <iostream>
#include <vector>

struct dummySort
{
template <typename FI>
void operator() (FI begin_it, FI end_it)
{ ++begin_it; ++end_it; }
};

template <typename SortFunc>
void benchmark (char const * 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);
}

关于c++ - 模板函数可以作为另一个函数的模板参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47207423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com