SFINAE c++方法检查

SFINAE C++ method check

本文关键字:检查 方法 c++ SFINAE      更新时间:2023-10-16

我正试图把我的头绕在SFINAE上。我们用它来检查一个类是否有一个叫做"乘客"的方法。

通过一些在线示例,我们构造了以下模板类:
#ifndef TYPECHECK
#define TYPECHECK
#include "../Engine/carriage.h"
namespace TSS{
template<typename T>
class has_passengers{
private:
    typedef char one;
    typedef struct{char a[2];} two;
    template<typename C> static one test( decltype(&C::Passengers) );
    template<typename C> static two test(...);
public:
    static bool const value = sizeof(test<T>(0)) == sizeof(one);
};
template<typename T>
struct CarriageTypeCheck{
    static_assert(has_passengers<T>::value, "Train initialized with illegal carriage");
};
}

#endif // TYPECHECK

我得到了如何选择这两个测试方法中的任何一个的部分,但我不明白的是为什么test<T>在下一行中被初始化为0:

    static bool const value = sizeof(test<T>(0)) == sizeof(one);

我看不出0对检查有多重要。还有一件事,为什么要使用decltype ?

第一个重载函数(可能)接受指向类方法的指针作为形参。由于c++从C遗留下来的,值0可以转换为NULL指针,或nullptr。因此,如果SFINAE没有踢出第一个重载函数,则test<T>(0)成为一个有效的函数调用,并且它的sizeof等于sizeof(one)。否则,这将解析为第二个重载函数调用。

关于为什么使用decltype的简短回答:否则它将不是有效的c++。在函数声明中,函数的形参必须是types,为函数指定形参的类型。&C::Passengers不是类型(在其预期使用的上下文中),因此这在c++中是无效的。的decltype()自动获取其参数的类型,使其在c++中有效。

我不明白为什么0对检查工作很重要。

因为0可以用作两种情况的实参(即两个重载的test);... .

还有一件事——为什么要使用decltype ?

decltype用于描述成员指针的类型(即&C::Passengers)作为test的形参。