2016-02-12 151 views
5

有沒有辦法從模板專業化模板中獲取模板?例如。 std::unordered_mapstd::unordered_map<char, char>類型的變量作爲模板模板參數傳遞。模板專業化模板

小例子:

#include <unordered_map> 

template <template <class ...> class t_map> 
class A 
{ 
public: 
    typedef t_map <int, int> map_type; 
}; 

int main(int argc, char const **argv) 
{ 
    std::unordered_map<char, char> map; 

    // decltype yields std::unordered_map<char, char> (as expected). 
    typename A<decltype(map)>::map_type map_2; 
    return 0; 
} 
+0

這取決於你想用模板做什麼。一般來說,你可以傳遞類型而不是模板。你可能能夠取代模板參數。你能給更多的上下文嗎? – MarkusParker

+0

我有幾個類(爲了多態性)採用模板模板參數並從中進行專門化。這些類爲地圖類型容器提供了一個最小的接口。一個需要一個'std :: map',另一個'std :: vector'並且實現完美的哈希。爲了測試這些類的許多專業化,編寫一個函數只需要一個模型容器(例如'std :: map '),然後將其傳遞給我的類就可以了。 – tsnorri

回答

3

下面是如何創建一個新的類型,其中模板參數(INT)(通過字符串)交換的例子:

#include <vector> 
#include <string> 

template <typename container, typename newt> 
struct replace; 

template <typename p1, typename alloc, template<typename,typename > class containerTemplate, typename newt> 
struct replace<containerTemplate<p1,alloc>,newt> { 
public: 
    typedef containerTemplate<newt,alloc> result; 
}; 

int main() { 
replace<std::vector<int>,std::string>::result vs; 
vs.push_back("a string"); 
} 

這樣,您就可以通過的std :: unordered_map爲模板參數傳遞給你的函數,並用你想要的任何其他類型替換char。您可能需要根據您的需求調整我的示例。但原則應該清楚。

編輯: 更通用集裝箱,通用少更換:

template <class Container> 
struct replace; 

template <template <class...> class Container, class... Ts> 
struct replace<Container<Ts...>> { 
    typedef Container<std::string> result; 
}; 
+0

哇,你已經做到了。 –

+0

'alloc'應該也可以反彈到新的類型。 – Jarod42

0

我不能完全肯定,這是你所尋找的,但不會模板化的別名聲明融入您的例子嗎?

#include <iostream> 
#include <map> 

template <typename T> 
using mm = std::map<T, T>; 

int main() 
{ 
    mm<int> i; 
    mm<char> c; 
} 
+0

不幸的是,因爲我想將一個專門的變量傳遞給模板函數並在那裏訪問模板。 – tsnorri