gpt4 book ai didi

c++ - SFINAE C++ 方法检查

转载 作者:太空狗 更新时间:2023-10-29 21:14:39 24 4
gpt4 key购买 nike

我正在尝试全神贯注于 SFINAE。我们用它来检查一个类是否有一个名为“Passengers”的方法。

通过一些在线示例,我们构建了以下模板类。

#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++。在函数声明中,函数的参数必须是类型,指定函数参数的类型。 &C::Passengers不是类型(在其预期用途的上下文中),因此这不是有效的 C++。 decltype() of that automatically gets the type of its argument, making it valid C++.

关于c++ - SFINAE C++ 方法检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40329684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com