C++ SFINAE基本语法
时间: 2023-09-07 22:18:02 浏览: 173
SFINAE (Substitution Failure Is Not An Error) 是一种 C++ 的模板机制,用于在编译时进行类型推导和函数重载选择。它的基本语法如下:
```
template <typename T>
struct has_typedef_foo {
typedef char yes[1];
typedef char no[2];
template <typename C>
static yes& test(typename C::foo*);
template <typename>
static no& test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
```
这个例子是用来判断一个类是否有名为 `foo` 的成员类型。它的实现利用了函数模板的重载和模板参数推导机制。
首先定义了两个类型 `yes` 和 `no`,分别占用 1 和 2 个字节。然后定义了两个静态函数模板 `test`,其中第一个版本使用了模板参数 `typename C::foo*`,并返回 `yes&` 类型;第二个版本使用了省略号,表示可以接受任意参数,但是返回 `no&` 类型。最后,在类中定义了一个静态常量 `value`,用来判断 `sizeof(test<T>(0))` 是否等于 `sizeof(yes)`,如果是,则表示类 `T` 中有成员类型 `foo`,否则没有。
在编译时,编译器会尝试将模板参数 `T` 替换到 `has_typedef_foo` 中,然后根据函数模板的重载规则选择调用哪个版本的 `test` 函数,如果模板参数推导失败,则选择第二个版本,返回 `no&` 类型。最后,通过比较 `sizeof(test<T>(0))` 是否等于 `sizeof(yes)` 来判断类 `T` 中是否有成员类型 `foo`。
需要注意的是,SFINAE 只适用于模板函数和模板类中的函数成员,对于非模板函数没有作用。此外,在使用 SFINAE 时需要注意错误处理,避免编译器报错。
阅读全文
相关推荐















