C++ 对于模板参数给出的类型有某种鸭子类型。我们不知道什么类型DUCK1
and DUCK2
会的,但只要他们可以quack()
,它将编译并运行:
template <class DUCK1, class DUCK2>
void let_them_quack(DUCK1* donald, DUCK2* daisy){
donald->quack();
daisy->quack();
}
但写起来有点不方便。当我完全不关心实际类型时DUCK1
and DUCK2
而是想充分利用鸭子打字的想法,那么我想要一些与上面略有不同的东西:
- 我想省略编写重复且几乎毫无意义的模板参数列表(想象一下如果有 7 只鸭子会发生什么......)
- 我想更明确地说,类型从未被使用过,只有接口才是重要的。
- 我想要某种接口注释/检查。以某种方式明确类型背后期望的接口。 (然而,这与鸭子类型有点不同。)
C++ 是否提供任何功能来实现这 3 个想法中的一个或多个?
(我知道在大多数情况下,虚拟继承是实现此类模式的选择方法,但这里的问题具体是关于静态多态性的情况。)
关于问题 1 和 2:从 C++14 开始,您可以省略显式template <typename ...
样板和使用auto
,但仅限于 lambda:
auto let_them_quack = [] (auto & donald, auto & daisy){
donald.quack();
daisy.quack();
};
(是的,我更喜欢引用指针)。 GCC 允许在常用函数中作为扩展这样做。
对于问题3,你所说的叫做concepts。它们在 C++ 中存在了很长时间,但只是作为一个文档术语。现在概念 TS正在进行中,允许您编写类似的内容
template<typename T>
concept bool Quackable = requires(T a) {
a.quack();
};
void let_them_quack (Quackable & donald, Quackable & daisy);
请注意,它还不是 C++,只是一个正在进行中的技术规范。不过,GCC 6.1 似乎已经支持它了。使用当前 C++ 实现概念和约束是可能的;你可以在其中找到一个boost http://www.boost.org/doc/libs/1_60_0/libs/concept_check/concept_check.htm.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)