C++惯用法: 通过std::decltype来SFINAE掉表达式
目录
(图片来源网络,侵删)
1.什么是SFINAE
2.SFINAE(替换失败不是错误)
3.通过std::decltype来SFINAE掉表达式
1.什么是SFINAE
SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们在进行模板特化的时候,会去选择那个正确的模板,避免失败。
SFINAE一般用于函数重载和编译期间类型检查,标准库中很多type traits模板就是通SFINAE来实现的。
看个具体的例子:
#include #include using namespace std; template struct check_has_member_id { // 仅当T是一个类类型时,“U::*”才是存在的,从而这个泛型函数的实例化才是可行的 // 否则,就将触发SFINAE template static void check(decltype(&U::id)){} // // 仅当触发SFINAE时,编译器才会“被迫”选择这个版本 template static int check(...){} enum {value = std::is_void::value}; }; struct TEST_STRUCT { int rid; }; struct TEST_STRUCT2 { int id; }; int main() { check_has_member_id t1; cout
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。