编写一个可以使用std :: vector或std :: set的模板

Ben*_*enj 5 c++ templates

我编写了一个异步作业队列类,它已经很好地工作了很长时间.它使用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.如何做出关于调用哪个的编译决定?或者有一个方便的适配器我可以使用?

And*_*owl 5

我宁愿使用重载的辅助函数.下面的内容依赖于以下事实:没有标准容器暴露单参数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)

这是一个实例.


ltj*_*jax 4

insert(iterator, value_type)重载并用 调用它怎么样end()?两者都可用,并且应该可以满足您的需求!std::list也有效!

这里确实不需要类型调度。