我現在想要製作模板,它將一些元素推送到向量和其他類型,支持push_back
運算符。調用函數,如果有,則忽略
我能做到這樣
template<typename T>
T fill(size_t n) {
T v;
//(1)
for(size_t i = 0; i < n; ++i){
v.push_back(generate_some_how());
}
return v;
}
它的工作原理。但是現在我想用v.reserve(n);
而不是(1)
來提高支持它的類型的速度。但我想仍然能夠編譯此代碼的類型不會編譯reserve
這是實現這一點的簡單方法嗎?
我知道我可能專注於硬編碼類型,但它似乎並不好。
C++ 11是可以的。
我懷疑它,但我不確定。我的猜測是你將不得不使用模板專門化 – 2013-03-08 20:05:34
不太難......你需要編寫一個特徵來檢測具有正確簽名的'reserve'成員函數的存在。有了這個工具,你可以使用不同的方法,你可以編寫一個'reserve_'模板函數,使用這個特性分派給'reserve()'或者一個no-op的調用,並從//調用它)'或者你可以在助手或者'fill'中使用SFINAE。我會嘗試使用輔助函數,因爲'fill'中的大部分代碼都是相同的。 – 2013-03-08 20:07:00
如果您使用的是C++ 11,請考慮支持適當的'emplace'調用來替換'push_back'。 – 2013-03-08 20:20:41