在不同的类上调用不同的成员函数

时间:2013-10-25 16:19:17

标签: c++ visual-studio-2012 c++11 typetraits

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

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

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

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

2 个答案:

答案 0 :(得分:3)

我建议你使用

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

将会做到这两点。对于有序容器,它等效于push_back,只需在任何关联容器中插入值即可。如果MyContainer不支持,则应扩展它。以上是将元素插入/推回到所有标准库容器的最便携方式。


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

答案 1 :(得分: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;
};

勒兹。