1

当我在编译时使用 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 测试类中是否存在类型对于派生类也是正确的,如何限制到该类?

4

0 回答 0