![]() |
1
20
这两个版本在默认模板参数SFINAE或
可读性
对于您的特定示例,您可以有以下定义:
在名为
如果
表现力但是,区分线外和类内定义的不仅仅是可读性的提高。虽然每个类内定义都可以很容易地移动到行外定义,但相反的情况并非如此。一、 e.线外定义比类内定义更具表达力。当您拥有依赖于彼此功能的紧密耦合类时,会发生这种情况,因此前向声明不够。
例如,如果您希望命令模式支持命令链接,则可以使用命令模式
和
让它支持用户定义的函数和仿函数,而不必从某些基类继承。如此
这意味着
那么,您将如何实现
请注意,命令在定义时不能是不完整的类型,因为编译器需要知道
有了这个助手,我们可以实现
再次注意,如果
结论因此,总结一下:这主要是你喜欢哪一种口味的问题,因为两者之间没有太大区别。只有在类之间存在循环依赖关系时,才能在所有成员函数的类定义中使用循环依赖关系。无论如何,我个人更喜欢离线定义,因为外包函数声明的技巧也可以帮助文档生成工具,如doxygen,它将只为实际类创建文档,而不为在另一个文件中定义和声明的其他助手创建文档。 编辑
如果我正确理解了你对原始问题的编辑,你想看看SFINAE,
|
![]() |
2
17
这是一个非常琐碎的案例,但值得一提: 专业化 . 例如,您可以使用线外定义执行此操作:
如果希望仅对类内定义执行相同的操作,则必须为
当然,您仍然可以混合使用类定义和行外定义来实现这一点,并且您拥有与完整行外版本相同数量的代码。
另一件事,你可以做的行外类定义,你不能做的类内定义是函数模板专门化。
在这种情况下,上述问题的答案是: 该语言的某些功能甚至无法用于其中一个版本 . 例如,考虑以下代码:
假设类的设计器希望为
最后,行外定义有助于打破循环依赖。
|
![]() |
3
13
通过将声明与实现分离,可以执行以下操作:
现在,什么会使它有用呢?嗯,标题
如果函数模板是内联定义的,则必须包括
除了解决循环依赖关系之外,定义函数(无论是否为模板)也会使声明以一种有效的形式作为目录,这比散布在充满定义的标题中的声明更易于程序员阅读。当您使用专门的编程工具来提供标题的结构化概述时,这种优势就会减弱。 |
![]() |
4
1
我总是倾向于合并它们,但如果它们是相互依赖的,就不能这样做。对于常规代码,您通常将代码放在.cpp文件中,但对于模板,整个概念并不真正适用(并导致重复的函数原型)。例子:
当然,这是一个人为的例子,但用其他东西替换函数。这两个类在使用之前需要彼此定义。如果使用模板类的前向声明,则仍然不能包含其中一个的函数实现。这是一个很好的理由,让他们脱线,这是100%修复每次。 一种选择是将其中一个类作为另一个类的内部类。内部类可以延伸到外部类,超出其自身的函数定义点,因此问题是隐藏的,在大多数情况下,当您有这些相互依赖的类时,这是可用的。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 5 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 5 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 5 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 5 月前 |