【发布时间】:2013-10-23 21:57:29
【问题描述】:
我正在寻找一种将元素添加到 STL 容器背面的通用方法。我希望代码支持尽可能多类型的 STL 容器。下面这段代码演示了我的问题:
#include <vector>
#include <string>
using namespace std;
template<typename T>
class S {
T built;
typename T::iterator built_it;
public:
S() : built{}, built_it{built.end()} {}
void add_to(typename T::value_type e) {
built.emplace(built_it, e);
++built_it;
}
const T& get() {
return built;
}
};
int main()
{
S<std::vector<int>> e;
S<std::string> f;
e.add_to(3); // works
f.add_to('c'); // doesn't
}
这里的问题很微妙。这段代码非常适合vectors,因为std::vector 实现了emplace 函数。但是std::string 没有!是否有更通用的方法来执行相同的操作?
【问题讨论】:
-
为什么不用
push_back而不是emplace?push_back受到两者的支持,并且似乎更符合您想要做的事情。 -
push_back不受std::list之类的支持。我想这可能是一个有效的妥协。 -
push_back支持std::list: cplusplus.com/reference/list/list/push_back -
呃,哎呀!谢谢,我会试试这个,看看我能走多远。