最近我看到很多关于泛型编程的材料,在设计类型时,我仍然无法将自己的头围绕在一件事上。我不确定什么是最好的方式,让我解释一下。类型设计:值类型,默认构造性,可选<T>及其关系?
对于某些类型,提供默认构造函数是很自然的。 该类型的所有可能的构造都是有效的,或者默认是有意义的,所以提供默认值是有意义的。基本类型就是这种情况。
后来,有一些类型的默认构造它们不会产生一个值。例如,在标准库中,我们有std::function<Sig>
和std::thread
。尽管如此,即使它们没有价值,它们也是默认构造的。
后来我们在标准中提出了optional<T>
。将它用于基本类型非常有意义,因为对于基本类型,所有可能的赋值都表示一个有效值(双精度和浮点型NaN除外),但我不知道如何将它用于thread
或std::function<Sig>
,因为这些类型在构建时不具有“价值”。它是AS,如果这些类型直接嵌入类型的“可选”。
这有这些缺点。由于没有“自然”默认(或价值)建设,如用一个int:
- 现在我要我的垃圾类在我所有的设计
if (valid)
和信号错误。或 - 使它不太安全使用,如果我不做这个检查。先决条件 - >在使用前分配,如果默认构造。
所以当我想要设计一个类型时,我总是会发现这样一个问题:我应该使它成为默认可构造的吗?
优点:
- 容易重新在更一般的环境中,因为我喜欢的类型会更容易建模半规则或规则,如果我补充此时,相应的操作。
缺点:
- 产仔了全班同学
if
陈述或作出与该班是更不安全了用户的使用合同。
例如,假设我有一个带有ID,艺术家,标题,持续时间和年份的类Song
。标准库使类型默认可构造是非常好的。但是:
- 我不能找到构建“默认歌曲”的自然方法。
- 我得乱抛垃圾
if (validsong)
或使它不安全使用。
所以我的问题是:
我应该怎样设计一个没有“天然(在价值上)”默认类型?我应该提供一个默认的构造函数吗?
在我选择提供默认构造函数的情况下,
optional<T>
如何适应所有这个难题?我的观点是,使一个不是“自然”默认构造的类型提供一个默认的构造函数,使optional<T>
在这种情况下无用。optional<T>
optional<T>
只适用于值域完整的类型,也就是说,我不能为它的表示赋一个无效值,因为它们都有一个值,比如int?为什么像
std::function<Sig>
这样的类型在标准的第一位默认构造?构造时,它不具有值,所以我不明白为什么应该提供默认的构造函数。例如,您始终可以这样做:optional<function<void()>>
。这只是一个设计选择,两者都是有效的,或者有一种设计,在这种情况下,选择默认与非默认构造优于其他构造?
其实,我对斯捷潘诺夫和肖恩家长对这些问题的看法非常感兴趣。任何材料?没有完成阅读编程元素,也许答复在那里。 – 2014-10-29 06:17:49