是,與模板模板模板參數:
template <template <typename, typename> class M, typename K, typename V>
void Foo(M<K, V> & container)
{
// ...
};
注意,這絕不會匹配任何真正的字容器,但是,因爲那些有更多的模板參數。與variadics更好:
template <template <typename, typename, typename...> class M, typename K, typename V, typename ...Args>
void Foo(M<K, V, Args...> & container)
{
// ...
};
如果variadics是不是一種選擇,你可以利用自己包裹的一點:
template <typename Container> void FooImpl(Container &);
template <template <typename, typename> class M,
typename K, typename V>
void Foo(M<K,V> & c) { FooImpl(c); }
template <template <typename, typename, typename> class M,
typename K, typename V, typename A1>
void Foo(M<K,V,A1> & c) { FooImpl(c); }
template <template <typename, typename, typename, typename> class M,
typename K, typename V, typename A1, typename A2>
void Foo(M<K,V,A1,A2> & c) { FooImpl(c); }
// etc.
僅供參考,std::unordered_map
需要五個模板參數(鍵,值,哈希函數對象,等式謂詞,分配器)。 Boost的bimap
可能需要更多。
通過使函數成爲包裝類的靜態成員並使實現保持私有狀態,並通過提供單個自由訪問器輔助函數,可以防止濫用最後一個構造。
爲什麼不只是'template void myFunc(std :: map map){...}'? –
@Oli Charlesworth - 因爲我想讓我的函數接受'map','unordered_map ','concurrent_hash_map '等 –
也許比我過於廣泛的答案稍微更有語義的方法是檢查是否存在'key_type'和'mapped_type'成員類型。這可以通過特質檢查來完成。另一方面,方括號運算符真的很特別,只存在極少的數據結構... –