私はSFINAEの周りを頭で囲んでいます。 クラスに「乗客」というメソッドがあるかどうかを確認するために使用しています。SFINAE C++メソッドチェック
いくつかのオンラインの例では、次のテンプレートクラスを構築しました。
#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
私は2つのテストの方法のいずれかが選択されているかの部分を得るが、test<T>
は次の行に0に初期化され、なぜ私が理解していないことである。
static bool const value = sizeof(test<T>(0)) == sizeof(one);
私ができますチェックが機能するために0がどのように重要であるかは分かりません。 別のもの - なぜdecltypeが使用されていますか?
クラスにメンバー関数「乗客」があるかどうかはチェックしていません。あなたは機能しているかもしれないメンバーである乗客がいるかどうかをチェックしていますが、そうである必要はありません。 – krzaq
良い点!ありがとう! –