我编写了一个异步作业队列类,它已经很好地工作了很长时间.它使用a std::vector
作为底层集合来保留作业,然后按照您的预期稍后处理它们.当我添加一份工作时,它会push_back
对此进行处理vector
.
最近我决定要模仿它使用的底层集合类型以及我编写它的方式,这应该非常简单.它现在宣布如下:
template<typename J, typename CollectionT = std::vector<J>>
class async_jobqueue
{
public:
Run Code Online (Sandbox Code Playgroud)
只有一个障碍,对于矢量型容器我想把东西推到集合的末尾并调用push_back
,我想要调用的定型容器insert
.如何做出关于调用哪个的编译决定?或者有一个方便的适配器我可以使用?
我宁愿使用重载的辅助函数.下面的内容依赖于以下事实:没有标准容器暴露单参数insert()
函数和push_back()
函数:
#include <utility>
template<typename C, typename T>
auto insert_in_container(C& c, T&& t) ->
decltype(c.push_back(std::forward<T>(t)), void())
{
c.push_back(std::forward<T>(t));
}
template<typename C, typename T>
auto insert_in_container(C& c, T&& t) ->
decltype(c.insert(std::forward<T>(t)), void())
{
c.insert(std::forward<T>(t));
}
Run Code Online (Sandbox Code Playgroud)
这就是你如何使用它们:
#include <set>
#include <vector>
#include <iostream>
int main()
{
std::set<int> s;
std::vector<int> v;
insert_in_container(s, 5);
insert_in_container(v, 5);
std::cout << s.size() << " " << v.size();
}
Run Code Online (Sandbox Code Playgroud)
这是一个实例.
insert(iterator, value_type)
重载并用 调用它怎么样end()
?两者都可用,并且应该可以满足您的需求!std::list
也有效!
这里确实不需要类型调度。