我正在尝试为具有特定名称的内部类的类提供不同的模板专业化。我从这里得到了一个线索并尝试了以下方法:
#include <iostream>
template< typename T, typename Check = void > struct HasXYZ
{ static const bool value = false; };
template< typename T > struct HasXYZ< T, typename T::XYZ >
{ static const bool value = true; };
struct Foo
{
class XYZ {};
};
struct FooWithTypedef
{
typedef void XYZ;
};
int main()
{
// The following line prints 1, as expected
std::cout << HasXYZ< FooWithTypedef >::value << std::endl;
// The following line prints 0. Why?
std::cout << HasXYZ< Foo >::value << std::endl;
return 0;
}
如您所见,如果我在 中测试typedef
-defined 类型FooWithTypedef
,它可以工作。但是,如果类型是真正的内部类,则它不起作用。它也仅在typedef
-ed 类型FooWithTypedef
与初始模板声明中第二个参数的默认值匹配时才有效(void
在我的示例中)。有人能解释一下这里发生了什么吗?专业化过程在这里如何运作?