该计划:
#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
?
答案 0 :(得分:2)
通过命名您已实例化的类型。一旦引用tmpl<SomeTypeNamedFoo>
,编译器就会代表您自动实例化。
答案 1 :(得分:1)
不,不是这样。 is_class
检查它是否为类(例如,不是枚举)。如果您使用SFINAE中断tmpl
安装,则会出现编译错误。
例如这样:
template <>
struct tmpl<int>{ char off[-1];};
答案 2 :(得分:1)
为什么需要确定特定类型的模板实例化是否已经发生。让编译器做到!
只要您Temp<T>
,就会发生实例化。即使它此时没有发生,也可能发生在另一个翻译单元中。你如何弄明白,如果在另一个翻译单元中发生(或不发生)实例化,你会怎么做?实例化的顺序在项目的不同构建之间也可能不同。