2013-10-25 46 views
0

我试图写的模板函数的元素插入到容器中,使得其将使用这取决于任一push_back()insert()或可用。上不同的类中调用不同成员函数

[编辑:还应当对界定一个insert()成员函数其他(内部)容器状类型工作。

我一直在寻找到<type_traits>但至今未能拿出一个非笨重的实现。

注:编译器VS2012所以不是所有的11 C++功能都可用。

+2

当两者都可用时,你会做什么? – juanchopanza

回答

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

勒兹万。

3

我建议你使用

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

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


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

+0

v.end()提示是否会对某些容器的性能产生不利影响? –

+0

@AlexO理论上是。如果它是* correct *提示,它可能有助于'std :: map'的情况,因为您已经靠近需要插入元素的树中的位置。如果它是错误的提示,*可能会有一个小的额外开销,但特别是'end()'被用作“提示”时,在实现中可能会有额外的优化。或者,如果它是'end()',则该提示将被完全忽略。我个人不会太担心。 –

+0

不幸的是,我们有几个内部容器类公开了一个insert()成员函数bun而不是一个迭代器。此外,您指出的示例在VS2012下不能编译。 –

相关问题