SFINAE c++方法检查
SFINAE C++ method check
我正试图把我的头绕在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
的形参。
相关文章:
- C++:正在检查LinkedList中的回文-递归方法-错误
- 检查哪个对象调用了另一个对象的对象方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 检查类是否在方法中实例化
- 检查类方法中是否(此 == nullptr)
- 检查子类型时的专用方法模板
- 检查两个向量是否并行的最有效方法
- 如何检查在编译时是否调用了模板化方法?
- 尝试编译SFINAE检查中使用的方法体时发生编译错误
- 有没有一种简单的方法来检查C++中的不安全表达式
- 是否有更有效的方法来检查元素是否在给定的区间内
- 检查特定目录中是否存在与文件匹配的 abc* 的最佳方法
- 当元组给出参数时,如何检查方法是否存在?
- 哪种检查方法比设置值最理想
- 在VS2015上使用SFINAE的模板上检查方法存在
- 这种错误检查方法的性能会不会太高
- 检查方法是否为常量
- 编译时检查方法是否定义为虚拟
- 我可以使用google mock来检查方法参数而不需要预先设置期望吗?
- c++11元编程:检查方法是否存在