首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++那些事之SFINAE

SFINAE概念只是为“健全”编译器保证这种“健全”行为。 所有的表达式都不会导致SFINAE。一个广泛规则是说功能/方法主体之外所有替代都是“安全”。...2.3 sizeof运算符 sizeof运算符确实是一个不错工具!它允许我们在编译时返回类型或表达式字节大小。sizeof非常有趣,因为它精确地计算表达式,就像编译表达式一样精确。...在C ++ 11中,生活要容易得多,所以让我们看一下这个新标准美妙之处! 注意:同样重要是要知道这段代码在一个表达式上创建了一个SFINAE(“&C::serialize”)。...如您所见,auto允许使用尾随返回类型语法,并使用decltype以及涉及函数参数之一表达式。这是否意味着我们可以使用它来测试SFINAE序列化存在? 是的,沃森博士!...在c++ 11中,constexpr有很多规则,只能使用一小部VIEs(非常重要表达式)表达式(没有循环……)!

2.2K20

现代C++之SFINAE

SFINAE概念只是为“健全”编译器保证这种“健全”行为。 所有的表达式都不会导致SFINAE。一个广泛规则是说功能/方法主体之外所有替代都是“安全”。...2.3 sizeof运算符 sizeof运算符确实是一个不错工具!它允许我们在编译时返回类型或表达式字节大小。sizeof非常有趣,因为它精确地计算表达式,就像编译表达式一样精确。...在C ++ 11中,生活要容易得多,所以让我们看一下这个新标准美妙之处! 注意:同样重要是要知道这段代码在一个表达式上创建了一个SFINAE(“&C::serialize”)。...如您所见,auto允许使用尾随返回类型语法,并使用decltype以及涉及函数参数之一表达式。这是否意味着我们可以使用它来测试SFINAE序列化存在? 是的,沃森博士!...在c++ 11中,constexpr有很多规则,只能使用一小部VIEs(非常重要表达式)表达式(没有循环……)!

2.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

C++设计模式之SFINAE:用来检测类中是否有某个成员函数

针对类中特定成员函数检测其实在工作中也可能用到。C++中可以用SFINAE技巧达到这个目的。...SFINAE是Substitution Failure Is Not An Error缩写,直译为:匹配失败不是错误。属于C++模板编程中高级技巧,但属于模板元编程中基本技巧。...当然我其实也并不是C++元编程方面的专家,只是搜集过一些常见实现方式,然后做过一些测试。在这个过程中,我发现有些常见SFINAE写法是有问题,下面探讨一下。...has_push_back::test >(NULL) << std::endl; return 0; } SFINAE实现方式有很多种,细节处可能不同。...因为网上能找到各种SFINAE实现版本中,很多对于push_back检测都是有问题。 而以上列举这两种,都能准确检测出string、vector、list中push_back()。

3.4K20

C++雾中风景18:C++20, 从concept开始

群里一个问题 SFINAE 熟悉C++模板编程小伙伴肯定第一时间想到通过SFINAE方式来解决,让笔者来解决这个问题的话,会写出下面的代码: template T test...std::is_same_v进行一个其实没什么意义类型比较,来满足static_assert语义,最终满足我们对模板类型T一些约束。...1). a + a这个是最简单,该表达式能通过编译则代表符合要求,这里不会进行实际计算。 2). typename T::type代表需要,T类型定义了type类型,才符合要求 3)....{a + a} -> std::same_as 这里{}代表了decltype(a + a)之后类型需要满足后面的concept需求。...而很多时候我们使用它需要 要进行模板推断类型编程设计 利用SFINAE方式来类型约束 这无形之中增加Coding时心智成本,而concept作为一个新语法糖,给了我们拆分二者机会:让上帝归上帝

59130

C++雾中风景18:C++20, 从concept开始

image.png 群里一个问题 SFINAE 熟悉C++模板编程小伙伴肯定第一时间想到通过SFINAE方式来解决,让笔者来解决这个问题的话,会写出下面的代码: template <typename...std::is_same_v进行一个其实没什么意义类型比较,来满足static_assert语义,最终满足我们对模板类型T一些约束。...1). a + a这个是最简单,该表达式能通过编译则代表符合要求,这里不会进行实际计算。 2). typename T::type代表需要,T类型定义了type类型,才符合要求 3)....{a + a} -> std::same_as 这里{}代表了decltype(a + a)之后类型需要满足后面的concept需求。...而很多时候我们使用它需要 要进行模板推断类型编程设计 利用SFINAE方式来类型约束 这无形之中增加Coding时心智成本,而concept作为一个新语法糖,给了我们拆分二者机会:让上帝归上帝

1.1K00

浅谈 C++ 元编程

为了更好支持 SFINAE,C++ 11   除了提供类型检查谓词模板 is_*/has_*,还提供了两个重要辅助模板: std::enable_if 将对条件判断 ...转化为常量表达式,类似测试表达式实现重载选择(但需要添加一个冗余 函数参数/函数返回值/模板参数); std::void_t 直接 检查依赖 成员/函数是否存在,不存在则无法重载(可以用于构造谓词...然后根据 SFINAE 规则: 使用 std::enable_if 重载函数 ToString,分别对应了数值、C 风格字符串和非法类型; 在前两个重载中: 分别调用 std::to_string 和...[cppref-SFINAE]: cppreference.com. ...SFINAE [EB/OL] http://en.cppreference.com/w/cpp/language/sfinae [cppref-tag-dispatch]: cppreference.com

2.9K60

性能优化利器之constexpr

从概念上理解的话,constexpr即常量表达式,重点在表达式字段,用于指定变量或函数可以在常量表达式中使用,可以(或者说一定)在编译时求值表达式,而const则为了约束变量访问控制,表示运行时不可以直接被修改...自C++17起,引入了if constexpr语句,在本节中,将借助SFINAEstd::enable_if来实现一个简单Square功能,最后借助if constexpr对代码进行优化(如果对...SFINAEstd::enable_if不是很了解,建议自行阅读哈)。...在上述代码中,为了编译成功,我们引入了两个Square()模板函数借助std::enable_if来实现,代码上多少有点冗余,在这个时候,本节主角if constexpr 出场,完整代码如下: #include...我们借助一个Square()函数模板以及更加符合编码习惯if语句就能解决上面的问题,且比使用std::enable_if方式更为优雅和符合阅读习惯,进而提高代码可阅读性。

33610

未来已来:从SFINAE到concepts

SFINAE SFINAE 是 "Substitution Failure Is Not An Error" 缩写。...std::enable_if 就是利用了 SFNIAE 概念,通过在模板参数替换失败时移除特化,实现了在编译期间条件选择。...与传统 if 语句不同,if constexpr 中条件表达式在编译时求值,只有符合条件分支才会被保留,而不符合条件分支在生成代码中会被舍弃。...概念提供了一种更加清晰和简洁方法,用于规定模板类型参数必须满足条件,以替代传统通过模板特化和SFINAE(Substitution Failure Is Not An Error)技术实现模板约束方式...template concept xxx = bool expression; 可以将其分为如下几个部分: •模板参数列表•关键字concept•concept后跟名称•bool类型表达式

14210

C++11 在析构函数中执行lambda表达式(std::function)捕获this指针陷阱

关于lambda表达式概念并不是本文重点,网上可以找到无数写得极好文章介绍它。...我想说是善用lambda表达式,将给C++编程带来极大便利,这是本人最近学习C++11以来真实深切感受,但是有时候误用lambda表达式也会给编程带来极大隐患,本文以最近经历说明lambda表达式在使用上一例陷阱...test_lambda是test_lambda_base子类,也很简单,在构造函数中将传入std::function用lambda表达式封装成std::function<void...我同样用前面在std::function析构函数加断点方式在eclipse+gcc环境下做了测试,测试结果表明gcc也是按C++标准顺序执行对象析构,但不同是gcc在构造下面这个lambda表达式时...总结 如果在基类析构函数中执行子类提供lambda表达式,lambda表达式中要避免使用子类中类成员变量。

1.5K10

C++11 元编程(meta-programming)判断T是否有==操作符

基本原理与文中差不多,利用SFINAE原则,通过返回类型后置来推断表达式类型,推断过程中利用declval,它可以获取类型右值引用,以便来调用==操作符,这个过程是在编译期完成。...如果通过==操作符比较declval右值引用成功了,则会继续推断逗号表达式类型,最终推断函数返回类型为bool; 如果通过==操作符比较declval右值引用失败了,则推断失败,编译器会选择优先级最低....); enum{value=std::is_same(0)), bool>::value}; }; 在上面代码中,推导test(int)返回类型表达式是由执行...有两种方式 declval()==declval()和declval().operator==(declval()) 第一种是真接按常用==操作符用法写==表达式,第二种则是把操作符...看来还是对STL提供元函数不熟悉,否则如果早想到看看std::is_assignable源码,就不会花这么时间了。

28930

C++17一个很冷门很有意思新特性

最近发现了一个有意思特性:void_t。 void_t是C++17引入一个新特性,它定义很简单(有些编译器实现可能不是这样,但也大体类似): templateusing void_t = void; 看着它很简单,但它搭配SFINAE却可以在模板元编程中发挥巨大作用。...::cout << '\n'; // 0} 它原理其实就是利用SFINAE和模板优先找特化去匹配特性,估计大家应该看示例代码就能明白...推荐阅读 内推字节 Linux C/C++ 开发那位同学没通过面试...... 那些做客户端 C/C++ 开发同学,现在怎么样了? 你简历中不要写这些信息哦!...哈哈哈,发年终奖啦,我要去斗鱼打赏最喜欢妹子~ 大厂,那高高围墙 来看一看两道大厂面试场景题 大厂伤我千百遍,我待大厂如初恋 给工作 4 年迷茫程序员们一点建议 『腾讯后台开发』实习生技能要求

61910

lambda with template

SFINAE,遂使用该特性解决上面这个问题: template struct IsVector : std::false_type{}; template<typename T...上述代码编译成功: • IsVector是一个模板类,继承于std::false_type • 传入IsVector参数为std::vector ,继承于std::true_type • if constexpr...表达式意思是如果vec是一个vector则执行函数体内for循环操作 ps: 对于consexpr这块不是很了解的话,建议看上一篇文章性能优化利器之constexpr 好了,截止到现在,上面的示例代码中...lambda支持了多类型std::vector以及传入非vector数据(比如上例中int),那么有没有一种更简单方式,支持多类型std::vector呢?...} with std::forward 在项目中有这样一个模块,针对不同服务返回数据,进行不同处理,现有代码实现如下: std::unorder_map

13910
领券