有没有办法获取模板实例的模板?
我已经完成了这个
#include <iostream>
using namespace std;
//some template class
template <class T>
struct Hola {
template<class H> using Base = Hola<H>; //typedef of the self template
T val;
};
int main() {
auto h = Hola<int>{}; //using template with int
h.val = 6.6;
auto b = typename decltype(h)::Base<float>{}; //using the same template with float
b.val = 6.6;
cout << h.val << endl << b.val << endl;
}
它按预期工作。
但是我想知道如果不在基本模板中定义using子句就可以这样做。我的意思是以下
#include <iostream>
using namespace std;
//same class without typedef of self
template <class T>
struct Hola {
T val;
};
int main() {
auto h = Hola<int>{};
h.val = 6.6;
using Templ = decltempl(h); //get the template of h
auto b = Templ<float>{}; //use the template of h with float
b.val = 6.6;
cout << h.val << endl << b.val << endl;
}
备注
假设所需类型只有一个可能的源模板,只是为了避免部分特化问题。
答案 0 :(得分:2)
你可以通过一些部分专业化来做到这一点。
template<typename T, typename U> struct templ_of;
template<typename T, template<typename> class U, typename A> struct templ_of<T, U<A>> {
using type = U<T>;
}
template<typename T, typename U>
using rebind = typename templ_of<T, U>::type;
这种机器用于标准分配器,它可以通过容器反弹。
答案 1 :(得分:0)
不幸的是,decltempl说明符不能存在于C ++中。 这是因为模板的工作方式; - )
类模板就像蛋糕食谱。当comiler注意到(在代码中)你想要使用特定种类的蛋糕(模板实例化)时,它会为你烘焙一个(创建一个常规类,不记得是模板)所以你可以用它作为蛋糕(类),而不是食谱(模板)。
你可以在编译时搞乱模板(阅读模板元编程),但在运行时这是不可能的。