获取模板实例c ++ 11的模板

时间:2015-12-12 16:45:43

标签: templates c++11

有没有办法获取模板实例的模板?

我已经完成了这个

#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;
}

备注

假设所需类型只有一个可能的源模板,只是为了避免部分特化问题。

2 个答案:

答案 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注意到(在代码中)你想要使用特定种类的蛋糕(模板实例化)时,它会为你烘焙一个(创建一个常规类,不记得是模板)所以你可以用它作为蛋糕(类),而不是食谱(模板)。

你可以在编译时搞乱模板(阅读模板元编程),但在运行时这是不可能的。