检查模板类实例化

时间:2013-03-21 14:45:15

标签: c++

该计划:

#include <iostream>

#include <type_traits>

template <class C>
struct tmpl
{
};

int main(int, char*[])
{
  std::cout << std::is_class<tmpl<int> >::value << std::endl;
  std::cout << std::is_class<tmpl<char> >::value << std::endl;
  return 0;
}

输出:

1
1

但我希望编译器能够确定模板类tmpl<int>tmpl<char>尚未实例化并输出0。可能吗?我是否实际在我的示例中实例化了类模板tmpl

3 个答案:

答案 0 :(得分:2)

通过命名您已实例化的类型。一旦引用tmpl<SomeTypeNamedFoo>,编译器就会代表您自动实例化。

答案 1 :(得分:1)

不,不是这样。 is_class检查它是否为类(例如,不是枚举)。如果您使用SFINAE中断tmpl安装,则会出现编译错误。

例如这样:

template <>
struct tmpl<int>{ char off[-1];};

答案 2 :(得分:1)

为什么需要确定特定类型的模板实例化是否已经发生。让编译器做到!

只要您Temp<T>,就会发生实例化。即使它此时没有发生,也可能发生在另一个翻译单元中。你如何弄明白,如果在另一个翻译单元中发生(或不发生)实例化,你会怎么做?实例化的顺序在项目的不同构建之间也可能不同。