C通用插入到std容器中?

如果我有以下程序:

#include <vector>
#include <set>

template<class T, class U>
void AddToContainer(T& container, U value)
{
  container.push_back(value);
}

int main(char**, int)
{
   std::vector<int> v;
   AddToContainer(v, 1);

   std::set<int> s;
   AddToContainer(s, 1);

   return 0;
}

如何将容器添加为通用?由于std :: set没有push_back但只有insert,因此无法编译.

解决方法:

你可以使用带有伪参数的表达式SFINAE来检查push_back()是否有效:

template <class C, class V>
auto append(C& container, V&& value, int)
    -> decltype(container.push_back(std::forward<V>(value)), void())
{
    container.push_back(std::forward<V>(value));
}

template <class C, class V>
void append(C& container, V&& value, ...)
{
    container.insert(std::forward<V>(value));
}

您的功能将转发到:

template <class C, class V>
void AddToContainer(C& container, V&& value) {
    append(container, std::forward<V>(value), 0);
}

如果push_back()是一个有效的表达式,那么第一个重载将是首选的,因为int比0更好地匹配…如果push_back()不是一个有效的表达式,那么只有一个可行的重载.

这实际上是一个好主意是一个单独的问题.

上一篇:c – 将std :: vector复制到std :: array中


下一篇:菜鸟系列docker——docker容器(7)