有没有办法从模板专业化中获取模板?例如。来自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;
}
答案 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;