模板专业化的模板

tsn*_*rri 5 c++ templates

有没有办法从模板专业化中获取模板?例如,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;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ker 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");
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以将 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;
};
Run Code Online (Sandbox Code Playgroud)