2014-01-06 32 views
1

的容器,我將模板的功能,以便與向量,集合,或STL的任何人都容器使用它(具有正確的API ...)模板:如何返回容器

我的功能當前原型是:

vector<vector<int>> f (const vector<int> & v, int size) {...} 

我嘗試不同種類的聲明,如下所示:

template<template<typename U, typename Alloc> class C, typename T> 
C<C<T, Alloc>, Alloc> f (const C<T, Alloc>& v, int size) 
{...} 

但我不覺得寫的正確方法。你可以幫我嗎 ?

+0

哪'Alloc'你想爲你的返回容器(外一種)? – Jarod42

回答

3

嘗試

template<template<typename...> class C1, template<typename...> class C2, typename T, typename... Args> 
C1<C2<T, Args...>> f (const C2<T, Args...>& v, int size) 
{...} 

,以允許不同的容器或

template<template<typename...> class C, typename T, typename... Args> 
C<C<T, Args...>> f (const C<T, Args...>& v, int size) 
{...} 

如果內部和外部容器需要是相同的或也許僅僅是:

template<template<typename...> class C, typename T> 
C<T> f (const T& v, int size) 

和訪問T::value_type代替上述第一個例子中的T

很難提供更好的諮詢爲一體的用例是從你的問題不清楚。


更新:解釋爲什麼你的企圖沒有工作:

template<template<typename U, typename Alloc> class C, typename T> 
C<C<T, Alloc>, Alloc> f (const C<T, Alloc>& v, int size) 
{...} 

看看它和再想一想:首先,你需要Alloc作爲另一個參數作爲參數的名稱模板模板參數不適用於任何事情。這將導致:

template<template<typename T_dummy, typename A_dummy> class C, typename T, typename Alloc> 
C<C<T, Alloc>, Alloc> f (const C<T, Alloc>& v, int size) 
{...} 

更好,但現在你有一個真正的問題:內部容器的分配器是一樣的東西

std::allocator<int> 

,適用於內的容器,而不是爲外部一個需要的東西在線

std::allocator<std::vector<int>> 

因此,嘗試重新使用內部分配器的外部容器註定要失敗。

+0

感謝您的回答以及有關模板參數推演如何工作的有用信息。由於我的輸出容器類型將與我使用第二個提議(「內部和外部容器需要相同」)的輸入形式相同。要添加一些上下文,你可以看看[這裏](http://ideone.com/lQeQ8n)來看看我是如何使用它的,目標是編寫一個模板函數來提取任何種類的容器的所有子集,插入「功能!再次感謝你。 – alexbuisson

1

你可能想:

template<template <typename, typename> class Container, typename T, typename Alloc> 
Container<Container<T, Alloc>, typename Alloc::template rebind<Container<T, Alloc> >::other> 
f(const Container<T, Alloc> & v, int size) { 
    // Your implementation 
    //return {{}}; 
} 

如丹尼爾弗雷提到的,分配器不能用於內和外容器是相同的,所以 上述代碼rebind分配器到正確的。

+0

@DanielFrey:謝謝,用'rebind'固定......但不是通用的:/ – Jarod42