我試圖寫的模板函數的元素插入到容器中,使得其將使用這取決於任一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