我试图写的模板函数的元素插入到容器中,使得其将使用这取决于任一push_back()
insert()
或可用。上不同的类中调用不同成员函数
[编辑:还应当对界定一个insert()
成员函数其他(内部)容器状类型工作。
我一直在寻找到<type_traits>
但至今未能拿出一个非笨重的实现。
注:编译器VS2012所以不是所有的11 C++功能都可用。
我试图写的模板函数的元素插入到容器中,使得其将使用这取决于任一push_back()
insert()
或可用。上不同的类中调用不同成员函数
[编辑:还应当对界定一个insert()
成员函数其他(内部)容器状类型工作。
我一直在寻找到<type_traits>
但至今未能拿出一个非笨重的实现。
注:编译器VS2012所以不是所有的11 C++功能都可用。
您可以使用一个辅助功能,你可以实现你想要的容器,就像这样:
template <class T>
void PushElement(std::vector<T> & v,const T & e)
{
v.push_back(e);
}
template <class T>
void PushElement(MyContainer & v,const T & e)
{
v.insert(e);
}
template <class C,class T>
void PushElement(C & ,const T &)
{
assert(false && "Implementation missing");
//error , the function was not specified for container C
}
template <class C>
class test
{
public:
void add(const typename C::value_type & e)
{
PushElement(m_container,e);
//for std::vector will use push_back
//for MyContainer will use insert
//for unknown container type you can throw assert
}
C m_container;
};
勒兹万。
我建议你使用
v.insert(v.end(), e);
的是将两者都做。对于顺序容器,它相当于push_back
,只是将值插入到任何关联容器中。如果MyContainer
不支持它,你应该扩展它。以上是将元素插入/推回到所有标准库容器的最便捷的方式。
我还问了一个问题,前一段时间关于如何正确检测容器类的成员函数,我得到了一个很好的答案,你可以为push_back
或insert
适应。你可以阅读关于它here。我在这里没有真正提出这个建议的原因是它不是必需的(鉴于上述情况),我不确定VS2012是否会编译它。
v.end()提示是否会对某些容器的性能产生不利影响? –
@AlexO理论上是。如果它是* correct *提示,它可能有助于'std :: map'的情况,因为您已经靠近需要插入元素的树中的位置。如果它是错误的提示,*可能会有一个小的额外开销,但特别是'end()'被用作“提示”时,在实现中可能会有额外的优化。或者,如果它是'end()',则该提示将被完全忽略。我个人不会太担心。 –
不幸的是,我们有几个内部容器类公开了一个insert()成员函数bun而不是一个迭代器。此外,您指出的示例在VS2012下不能编译。 –
当两者都可用时,你会做什么? – juanchopanza