模板专业化的模板

时间:2016-02-12 13:20:37

标签: c++ templates

有没有办法从模板专业化中获取模板?例如。来自std::unordered_map类型的变量的std::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;
}

2 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分:0)

我不完全确定,这是你正在寻找的,但是不会将模板化的别名声明放到你的榜样中吗?

with a(a) as (select '2')
select a from a;