Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以将使用SFINAE对嵌套枚举的测试限制为没有基类的类吗?_C++_Templates_Sfinae - Fatal编程技术网

C++ 我可以将使用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

当我使用SFINAE在编译时检测类是否有类型时,这似乎也包括派生类型。理想情况下,我希望测试枚举是否存在,但它显示了相同的效果:这两个测试通常都可以工作,但如果类派生类型或枚举,它们也会返回true

想要的输出只有A=1,其余为0。当然,一次只启用一个枚举或类型测试。GCC与C++03

tl;dr:使用SFINAE进行测试,如果类中存在类型,那么对于派生类也是正确的,那么如何限制到该类

#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