2013-10-25 45 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下不能編譯。 –

相關問題