我刚刚开始涉足 SFINAE,我无法理解以各种形式出现的最常用示例背后的语法,但我的想法是检查特定类型是否包含给定成员。这个特别的来自维基百科:
template <typename T> struct has_typedef_foobar
{
typedef char yes[1];
typedef char no[2];
template <typename C> static yes& test(typename C::foobar*);
template <typename> static no& test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
有几件事我不明白:
- 返回“是”的 test() 重载的参数类型是什么?是指针吗?为什么 typename 关键字用作参数的一部分?我已经看到它还用于测试一个类是否具有给定类型的成员,而不仅仅是 typedef,并且语法保持不变。
- 有时我会看到使用 test(int C::*) 的示例。这更奇怪,不知道我们引用的是 C 的哪个成员。如果它是一个带有主体的真实函数,为真实类型实例化,并且参数被命名,它会指向什么以及如何使用它?
模板 <typename T> func(int T::*arg) { *arg = 1; } 结构 Foo { 诠释 x; } 富; func<Foo>(&foo::x); // 像这样? 函数(&foo::x); // 或者甚至可能像这样?
- 如果没有在第二次重载中使用模板 <typename> 是否允许使用没有符号?那么它甚至是模板函数吗?
- 奖励:可以一次检查多个成员的存在吗?