通過我實現了Python的連鎖功能的C++相當於前一段時間由於可變參數模板。該函數用於連續遍歷許多容器。下面是使用一個名爲ChainedObject
發電機的功能,不管它是舊的工作版本:類型推演和論證與可變參數模板模板
template<typename... Iterables>
auto chain(Iterables&&... iters)
-> ChainObject<Iterables...>
{
return /* ... */;
}
和相應的主:
int main()
{
std::vector<int> vec = { 1, 2, 3, 4, 5 };
std::list<int> li = { 6, 7, 8, 9, 10, 11, 12, 13 };
for (auto& i: chain(vec, li))
{
// You can edit a range of iterables
// as if there was only one of them.
i *= 5;
std::cout << i << std::endl;
}
return 0;
}
這主要工作得很好。我們不在乎ChainObject中存在什麼問題,所以讓我們來看看它。我試圖用模板模板,以確保所使用的不同集合有同樣的value_type
和修改功能chain
方式如下:
template<typename T, template<typename...> class... Iterables>
auto chain(Iterables<T>&&... iters)
-> ChainObject<T, Iterables...>
{
return /* ... */;
}
我認爲這會做的伎倆,以確保我以前主要的list
和vector
共享相同的類型,而是,我從GCC 4.7.1以下錯誤:
In function 'int main()':
error: no matching function for call to 'chain(std::vector&, std::list&)'
note: candidates are:
note:
ChainObject<T, Iterables ...> chain(Iterables<T>&& ...) [with T = int; Iterables = {std::vector, std::list}
]note: no known conversion for argument 2 from '
std::list<int>
' to 'std::list<int>&&
'note:
ChainObject<T, Iterables ...> chain(Iterables<T>&& ...) [with T = int; Iterables = {std::vector, std::list}]
note: no known conversion for argument 2 from '
std::list<int>
' to 'std::list<int>&&
'error: unable to deduce 'auto&' from ''
看來,問題來自於通過採取右值引用的函數的參數。但是,我真的不明白爲什麼我的第一個版本運行良好,並注意使用模板模板。
您是否嘗試過通過左值引用,而不是右值嗎? –
請勿將模板模板與容器組合使用。一旦使用分配器就會失敗。只需檢查嵌套的'value_type'是否相等。 – pmr