![]() |
1
33
正如其他人提到的,C++0X正是把它内置到语言中的。在那之前,我建议 Bjarne Stroustrup 的 suggestions for template constraints . 编辑: Boost 也有一个 alternative of its own . 编辑2:看起来像 concepts have been removed from C++0x . |
![]() |
2
48
如果你使用C++ 11,你可以使用
例如,
|
![]() |
3
34
“含蓄地”是正确的答案。模板有效地创建了一个“duck-typing”场景,这是由于它们的编译方式。您可以对模板类型的值调用任何您想要的函数,唯一可以接受的实例化是为其定义该方法的实例化。例如:
我们可以在指向声明
…但不在指向类型的指针上
不
声明
第三个例子不会编译。
这是因为C++为每个实例化编译了一个新版本的模板化函数(或类)。在执行编译的过程中,它在类型检查之前直接、几乎像宏一样将模板实例化替换为代码。如果所有东西都能用这个模板工作,那么编译就会继续进行,我们最终会得到一个结果。如果有什么失败(比如
|
![]() |
4
14
你可以在没有任何作用的情况下设置一个防护类型,确保它在foo的t上:
|
![]() |
5
8
退房 Boost
|
![]() |
6
2
某种程度上。如果静态转换为ifoo*,那么除非调用方传递一个可以分配给ifoo*的类,否则将无法实例化模板。 |
![]() |
7
1
只是含蓄地。
|
![]() |
8
0
你可以做到。创建基本模板。使其仅具有私有构造函数。然后为您希望允许的每种情况创建专门化(或者,如果不允许的列表比允许的列表小得多,则创建相反的专门化)。 编译器不允许您实例化使用带有私有构造函数的版本的模板。 这个例子只允许用int和float进行实例化。
这不是一种短小精悍的方式,而是可能的。 |
![]() |
9
-1
看看CRTP模式(奇怪的是递归模板模式)。它旨在帮助支持静态继承。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 4 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 4 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 4 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 4 月前 |