当我在编译时使用 SFINAE 检测一个类是否有类型时,这似乎也包括派生类型。理想情况下,我想测试枚举的存在,但它显示出相同的效果:这两个测试通常都有效,但如果类派生类型或枚举,它们也会返回 true。
#include <iostream>
struct A { enum { IsTagged }; struct IsTaggedStruct{}; };
struct B :A {};
struct C {};
template< int > struct HasTag;
template< class TST >
struct Check
{
template< class T2 > static char (&Test( ... ))[1];
template< class T2 > static char (&Test( HasTag<T2::IsTagged>* ))[2];
//template< class T2 > static char (&Test( typename T2::IsTaggedStruct* ))[2];
static const bool value = sizeof(Test<TST>(0))==sizeof(char[2]);
};
int main(int argc, char* argv[])
{
std::cout << "Value A=" << Check< A >::value << std::endl;
std::cout << "Value B=" << Check< B >::value << std::endl;
std::cout << "Value C=" << Check< C >::value << std::endl;
return 0;
}
输出:
+ g++ -std=c++03 main.cpp
+ ./a.out
Value A=1
Value B=1
Value C=0
想要的输出只有 A=1,其余为 0。当然,一次只启用一个枚举或类型测试。GCC 与 C++03。
tl;dr:使用 SFINAE 测试类中是否存在类型对于派生类也是正确的,如何限制到该类?