|
1
33
如果你使用C++11,你可以使用
例如,
|
|
|
2
48
“含蓄地”是正确答案。由于模板的编译方式,模板有效地创建了一个“鸭子打字”场景。您可以在模板类型的值上调用任何您想要的函数,而唯一被接受的实例化是那些定义了该方法的实例化。例如:
我们可以在指向任何类型的指针上调用此方法,该类型声明
…但不是指向某个类型的指针
不
声明
第三个示例无法编译。
这之所以有效,是因为C++为每个实例化编译了一个新版本的模板化函数(或类)。当它执行编译时,它会在类型检查之前将模板实例化直接、近乎宏式地替换到代码中。如果所有内容仍然使用该模板,那么编译就会继续,我们最终会得到一个结果。如果有什么失败了(比如
|
|
|
3
34
正如其他人提到的,C++0x正在将此内置到语言中。在那之前,我会推荐 Bjarne Stroustrup s suggestions for template constraints . 编辑: Boost 也有一个 alternative of its own . 编辑2:看起来像 concepts have been removed from C++0x . |
|
|
4
14
你可以在IFoo上设置一个不做任何事情的守卫类型,确保它在Foo的T上:
|
|
|
5
8
查看 Boost
|
|
|
6
2
使用C++20,是的,有: Constraints and concepts 也许你想保证模板是从特定类派生出来的:
然后,以下代码会像正常情况一样编译:
但现在,当你违反合同时:
AnotherClass不是从ABase派生的,因此我的编译器(GCC)大致给出了以下错误:
正如你所想象的,这个特性非常有用,可以做的不仅仅是约束一个类具有特定的基。 |
|
|
7
1
某种程度上。如果你将static_cast转换为IFoo*,那么就不可能实例化模板,除非调用者传递一个可以分配给IFoo*的类。 |
|
|
8
0
你可以做到的。创建基础模板。使其仅包含私有构造函数。然后为您想要允许的每种情况创建专门化(或者如果不允许的列表比允许的列表小得多,则进行相反的专门化)。 编译器不允许您实例化使用私有构造函数版本的模板。 此示例仅允许使用int和float进行实例化。
这不是一种简短而优雅的方式,但这是可能的。 |
|
|
9
-1
只是含蓄地。
|
|
|
sungjun cho · 函数模板重叠多个匹配项 1 年前 |
|
|
Amaterastis · 基类接受子类和内部子类的模板参数 1 年前 |
|
|
111111 · 确定作为模板参数传递的函数的参数类型 1 年前 |
|
|
Sam · 在LaTeX中将图像添加到预制的投影仪中 1 年前 |
|
|
user416983 · 模板函数成员作为模板参数 1 年前 |
|
|
PyOPTProblem · c++如何模板化模板参数的部分实例化? 1 年前 |