受this question的启发,我想知道是否有一些编译时检查可以引入以检测是否有两个给定的模板实例化:
template <typename T>
class Templ...
typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;
是根据相同的定义构建的,或者如果它们是根据Templ
模板的不同特化构建的
基本上假设模板函数的行为如下:
template <typename T>
class Templ
{}
template <>
class Templ<std::string>
{}
template <>
class Templ<double>
{}
template <typename T1,typename T2>
class Belong_To_Same_Templ_Definition
{}
//tests
typedef Templ<std::string> stringInstance;
typedef Templ<double> doubleInstance;
typedef Templ<int> intInstance;
typedef Templ<char> charInstance;
assert( Belong_To_Same_Templ_Definition< intInstance , charInstance >::value == true);
assert( Belong_To_Same_Templ_Definition< intInstance , doubleInstance >::value == false);
assert( Belong_To_Same_Templ_Definition< stringInstance , doubleInstance >::value == false);
是否可以创建这种元函数?
答案 0 :(得分:3)
老实说,这似乎不太可能(虽然我无法明确排除狡猾的伎俩)。
对于给定的特殊化(在选择它的类型参数之外),没有第一类标识可供比较。
因此,如果需要,您可以使用自己的模板,但不能为现有模板编写临时推理。
还要考虑到无论如何都无法正常工作,因为它无法判断两个实例是否具有兼容的布局:即使Templ<int>
和Templ<char>
从相同的模板代码实例化,没有专门化,该代码可以使用 专门的特征类。