2017-05-25 64 views
4

假設我有一個模板函數,它接受各種向量(但由於各種原因,我不能在模板參數中提到這一點)。這裏就是我想要做的事情:在一個特定的位置插入一個新的,默認構造的元素,不知道它的類型:std ::向量插入不知道元素的類型

template <typename T> 
void foo(T* v) { 
    v->insert(v->begin() + 5, decltype(v->at(0))()); 
} 

這是不行的,但給你的是我想要一個想法去做。我也嘗試從std::vector使用value_type,但我也遇到了問題。任何想法如何解決這個問題?

+1

您應該得到一個有希望描述問題的錯誤。例如,GCC說:「錯誤:引用類型的值初始化」 – Justin

+0

'v.insert(v.begin()+ 5,decltype(v):: value_type());' –

+0

@RichardCritten這不起作用,這是太多的工作;我們已經可以使用'T' – Justin

回答

9

迴避整個 「命名型」 業務:

v->emplace(v->begin() + 5); 

v->insert(v->begin() + 5, {}); 

您當前的版本不工作,因爲decltype(v->at(0))是引用類型。 value_type應該如果你正確使用它,但沒有看到你在做什麼,我不能說它有什麼問題。

+0

可能'value_type'正在被使用,就像這樣:'v-> insert (v-> begin()+ 5,typename T :: value_type {})時需要使用(v-> begin()+ 5,T :: value_type {}) ' – Justin

+0

後續問題:如果我*做*必須調用矢量的值類型的靜態函數?那麼我確實需要類型,對嗎?說:'decltype(v-> at(0)):: Bar()',但是這也行不通。 –

+1

'std :: remove_reference at(0))> :: type :: Bar()'。如果你不關心強制執行靜態,也可以使用通常的'.'語法。 –

1

如果你知道v總是有些元素類型的std::vector,然後只需鍵入這種方式來開始,所以T是元素類型,而不是載體類型:

template <typename T> 
void foo(std::vector<T>* v) { 
    v->insert(v->begin() + 5, T()); 
} 

這也保證了v->insert()v->begin() + 5是有效的語句。您允許原始代碼任何東西要通過v,因此不能保證v->insert()v->begin()存在,或者begin()返回一個隨機訪問迭代器,它接受+ 5

相關問題