我想执行编译时检查特定成员是否存在于类中。 我发现了一些像这样的解决方案: Is it possible to write a template to check for a function's existence?
但他们都有自己的缺点。有没有机会(平台独立地)检查成员是否存在,即使该成员是由基类继承的?
编辑:似乎我必须在类型安全之间进行选择而不检测从基类继承的成员(1)或没有类型安全但能够检测到成员(2)。这令我很沮丧:struct base { int foo() { return 0; } };
struct derived : public base {};
struct other {};
template<class C>
struct has_foo
{
private:
typedef char(&yes)[1];
typedef char(&no )[2];
struct pseudo { void foo(); };
struct base : public C, public pseudo {};
template<typename T, T> class check{};
#if SFINAE_VERSION == 1
template<class U> static yes test(check<int (U::*)(), &U::foo>* = NULL);
template<class> static no test(...);
#elif SFINAE_VERSION == 2
template<class U> static no test(U*, check<void (pseudo::*)(), &U::foo>* = 0);
static yes test(...);
#endif
public:
#if SFINAE_VERSION == 1
static bool const value = sizeof(test(static_cast<base*>(NULL))) == sizeof(yes);
#elif SFINAE_VERSION == 2
static bool const value = sizeof(test<C>(NULL)) == sizeof(yes);
#endif
};
int main()
{
std::cout << has_foo<base>::value << std::endl; // true (1) | true (2)
std::cout << has_foo<derived>::value << std::endl; // false (1) | true (2)
std::cout << has_foo<other>::value << std::endl; // false (1) | false(2)
}
EIDT2: “可能重复”中提供的解决方案并不能解决我的问题。我需要完全的类型安全和检测从基类继承的成员。