0

该程序:

#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在我的示例中实例化了类模板?

4

3 回答 3

2

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

于 2013-03-21T14:56:52.153 回答
1

不,不是那样的。is_class检查它是否类(例如不是枚举)。如果你tmpl用 SFINAE 中断 instatioation,你会得到编译错误。

例如这种方式:

template <>
struct tmpl<int>{ char off[-1];};
于 2013-03-21T14:55:21.433 回答
1

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

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

于 2013-03-21T15:27:45.630 回答