SFINAE的例子不清楚

时间:2013-01-08 08:07:37

标签: c++ templates sfinae

http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error

#include <iostream>

template <typename T>
struct has_typedef_foobar {
    // Types "yes" and "no" are guaranteed to have different sizes,
    // specifically sizeof(yes) == 1 and sizeof(no) == 2.
    typedef char yes[1];
    typedef char no[2];

    template <typename C>
    static yes& test(typename C::foobar*);

    template <typename>
    static no& test(...);

    // If the "sizeof" the result of calling test<T>(0) would be equal to the sizeof(yes),
    // the first overload worked and T has a nested type named foobar.
    static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

struct foo {    
    typedef float foobar;
};

int main() {
    std::cout << std::boolalpha;
    std::cout << has_typedef_foobar<int>::value << std::endl;
    std::cout << has_typedef_foobar<foo>::value << std::endl;
}

以上示例显示了SFAINE。

  • 这里我无法理解为什么sizeof(是)== 1和 的sizeof(无)== 2。
  • 由于测试是静态功能,应该有一些 测试功能的定义也。这里的代码编译得很好 没有定义测试功能

1 个答案:

答案 0 :(得分:4)

1)sizeof(char)被定义为等于1.由于yes是一个char数组的typedef,因此它的大小必须为1。同样,由于no是两个字符数组的typedef,因此其大小必须为2 * sizeof(char),即2。

2)从不调用函数test,因此定义是不必要的 - sizeof运算符是编译时操作,因此编译器只查看返回类型的大小使用指定的模板参数实例化测试。因为它没有被调用,所以定义是不必要的,类似于制作私有的非定义复制构造函数,以使类不可复制构造。