0

我正在尝试编写一个模板函数来将一个元素插入到容器中,这样它将使用其中一个push_back()insert()取决于哪个可用。

[编辑:] 它也应该适用于定义insert()成员函数的其他(内部)类似容器的类型。

我一直在研究,<type_traits>但到目前为止还没有想出一个不笨拙的实现。

注意:编译器是 VS2012,因此并非所有 C++11 功能都可用。

4

2 回答 2

3

我建议你使用

v.insert( v.end(), e );

两者都会做。它等效push_back于序列容器,只是将值插入任何关联容器中。如果MyContainer不支持它,你应该扩展它。以上是将元素插入/推回所有标准库容器的最便携方式。


前段时间我还问了一个关于如何正确检测容器类型的成员函数的问题,我得到了一个很好的答案,你可以适应push_backor insert。你可以在这里阅读。我在这里没有真正建议这样做的原因是不需要它(鉴于上述情况),我不确定 VS2012 是否会编译它。

于 2013-10-25T16:44:44.207 回答
0

您可以使用可以为所需容器实现的辅助函数,例如:

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;
};

拉兹万。

于 2013-10-25T16:29:19.797 回答