C++ 我可以将使用SFINAE对嵌套枚举的测试限制为没有基类的类吗?
当我使用SFINAE在编译时检测类是否有类型时,这似乎也包括派生类型。理想情况下,我希望测试枚举是否存在,但它显示了相同的效果:这两个测试通常都可以工作,但如果类派生类型或枚举,它们也会返回true 想要的输出只有A=1,其余为0。当然,一次只启用一个枚举或类型测试。GCC与C++03 tl;dr:使用SFINAE进行测试,如果类中存在类型,那么对于派生类也是正确的,那么如何限制到该类C++ 我可以将使用SFINAE对嵌套枚举的测试限制为没有基类的类吗?,c++,templates,sfinae,C++,Templates,Sfinae,当我使用SFINAE在编译时检测类是否有类型时,这似乎也包括派生类型。理想情况下,我希望测试枚举是否存在,但它显示了相同的效果:这两个测试通常都可以工作,但如果类派生类型或枚举,它们也会返回true 想要的输出只有A=1,其余为0。当然,一次只启用一个枚举或类型测试。GCC与C++03 tl;dr:使用SFINAE进行测试,如果类中存在类型,那么对于派生类也是正确的,那么如何限制到该类 #include <iostream> struct A { enum { IsTagged
#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