2016-02-12 169 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