给定某种类型的容器作为输入,是否可以“提取”容器模板并将其实例化为不同的类型?例如:
void f ( auto& x ) {
getContainerTemplate(x)<int> a (10); // getContainerTemplate()
// is some magic function.
}
根据
f()
的类型,x
的效果应该如下:
void f ( std::vector<double>& x ) {
std::vector<int> a(10);
}
或
void f ( parlay::sequence<double>& x ) { // parlay::sequence is
// another container template storing elements contiguously.
parlay::sequence<int> a(10);
}
也许是这样的:
template <typename T, typename C>
struct ContainerTypeReplacer;
template <typename T, template <typename...> class C, typename... Args>
struct ContainerTypeReplacer<T, C<Args...>> {
using type = C<T>;
};
template <typename T, typename C>
typename ContainerTypeReplacer<T, C>::type getContainerTemplate(const C&);
用途:
void f (auto& x) {
// if x is of type e.g. std::vector<double>,
// then a is std::vector<int>
decltype(getContainerTemplate<int>(x)) a(10);
}