C++核心准则T.25:避免互补性约束

共 2087字,需浏览 5分钟

 ·

2020-09-01 21:27

大连 书香园

T.25: Avoid complementary constraints

T.25:避免互补约束


Reason(原因)

Clarity. Maintainability. Functions with complementary requirements expressed using negation are brittle.

清晰性。可维护性。包含互补的,使用否定方式表达的需求的函数是脆弱的。


Example (using TS concepts)(示例(使用TS概念))

Initially, people will try to define functions with complementary requirements:

最开始,人们试图用互补需求定义函数:

template
requires !C // bad
void f();

template
requires C
void f();

This is better:

下面的代码更好:

template   // general template
void f();

template // specialization by concept
requires C
void f();

The compiler will choose the unconstrained template only when C is unsatisfied. If you do not want to (or cannot) define an unconstrained version of f(), then delete it.

只有在C不能满足时,编译器才会选择非约束模板。如果你不想(或不能)定于f()的非约束性版本,删除它。

template
void f() = delete;

The compiler will select the overload and emit an appropriate error.

编译器会选择重载重载并报出适当的错误。


Note(注意)

Complementary constraints are unfortunately common in enable_if code:

很不幸,互补的约束在enable_if代码中很常见:

template
enable_if, void> // bad
f();

template
enable_if, void>
f();
Note(注意)

Complementary requirements on one requirements is sometimes (wrongly) considered manageable. However, for two or more requirements the number of definitions needs can go up exponentially (2,4,8,16,...):

一个需求上的互补需求有时(被错误地)认为是可控的。然而,对于两个或更多的需求,定义的数目需要可以按照指数方式增长。


C1 && C2
!C1 && C2
C1 && !C2
!C1 && !C2

Now the opportunities for errors multiply.

现在错误的可能性也倍增了。


Enforcement(实施建议)

  • Flag pairs of functions with C and !C constraints

  • 标记使用C 和!C 约束的函数对。


原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#t25-avoid-complementary-constraints


新书介绍

《实战Python设计模式》是作者最近出版的新书,拜托多多关注!

本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。




觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!



浏览 47
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报