mirror of
https://github.com/wuye9036/CppTemplateTutorial.git
synced 2024-03-22 13:11:16 +08:00
Fixed the format to meet the Github markdown format requirements.
This commit is contained in:
parent
ee0702cfef
commit
b0ae2e73e2
|
@ -532,9 +532,7 @@ template <int i> int Add(int a) // 当然也能用于函数模板
|
||||||
void foo()
|
void foo()
|
||||||
{
|
{
|
||||||
A<5> a;
|
A<5> a;
|
||||||
B<
|
B<7, A<5>, nullptr> b; // 模板参数可以是一个无符号八位整数,可以是模板生成的类;可以是一个指针。
|
||||||
7, A<5>, nullptr
|
|
||||||
> b; // 模板参数可以是一个无符号八位整数,可以是模板生成的类;可以是一个指针。
|
|
||||||
C<false, &foo> c; // 模板参数可以是一个bool类型的常量,甚至可以是一个函数指针。
|
C<false, &foo> c; // 模板参数可以是一个bool类型的常量,甚至可以是一个函数指针。
|
||||||
D<&A<3>::foo> d; // 丧心病狂啊!它还能是一个成员函数指针!
|
D<&A<3>::foo> d; // 丧心病狂啊!它还能是一个成员函数指针!
|
||||||
int x = Add<3>(5); // x == 8。因为整型模板参数无法从函数参数获得,所以只能是手工指定啦。
|
int x = Add<3>(5); // x == 8。因为整型模板参数无法从函数参数获得,所以只能是手工指定啦。
|
||||||
|
@ -781,7 +779,6 @@ template <typename T> T addFloatOrMulInt(T a, T b);
|
||||||
如果你运用了模板来实现,那么当传入两个不同类型的变量,或者不是 `int` 和 `float` 变量,编译器就会提示错误。但是如果使用了我们前述的 `Variant` 来实现,编译器可就管不了那么多了。但是,成也编译期,败也编译期。最严重的“缺点”,就是你没办法根据用户输入或者别的什么在运行期间可能发生变化的量来决定它产生、或执行什么代码。比如下面的代码段,它是不成立的。
|
如果你运用了模板来实现,那么当传入两个不同类型的变量,或者不是 `int` 和 `float` 变量,编译器就会提示错误。但是如果使用了我们前述的 `Variant` 来实现,编译器可就管不了那么多了。但是,成也编译期,败也编译期。最严重的“缺点”,就是你没办法根据用户输入或者别的什么在运行期间可能发生变化的量来决定它产生、或执行什么代码。比如下面的代码段,它是不成立的。
|
||||||
|
|
||||||
``` C++
|
``` C++
|
||||||
|
|
||||||
template <int i, int j>
|
template <int i, int j>
|
||||||
int foo() { return i + j; }
|
int foo() { return i + j; }
|
||||||
int main()
|
int main()
|
||||||
|
@ -789,7 +786,6 @@ int main()
|
||||||
cin >> x >> y;
|
cin >> x >> y;
|
||||||
return foo<x, y>();
|
return foo<x, y>();
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
这点限制也粉碎了妄图用模板来包办工厂(Factory)甚至是反射的梦想。尽管在《Modern C++ Design》中(别问我为什么老举这本书,因为《C++ Templates》和《Generic Programming》我只是囫囵吞枣读过,基本不记得了)大量运用模板来简化工厂方法;同时C++11和14中的一些机制如Variadic Template更是让这一问题的解决更加彻底。但无论如何,直到C++11/14,光靠模板你就是写不出依靠类名或者ID变量产生类型实例的代码。
|
这点限制也粉碎了妄图用模板来包办工厂(Factory)甚至是反射的梦想。尽管在《Modern C++ Design》中(别问我为什么老举这本书,因为《C++ Templates》和《Generic Programming》我只是囫囵吞枣读过,基本不记得了)大量运用模板来简化工厂方法;同时C++11和14中的一些机制如Variadic Template更是让这一问题的解决更加彻底。但无论如何,直到C++11/14,光靠模板你就是写不出依靠类名或者ID变量产生类型实例的代码。
|
||||||
|
@ -1064,8 +1060,7 @@ class ClassB {};
|
||||||
template <> class TypeToID<void ()>; // 函数的TypeID
|
template <> class TypeToID<void ()>; // 函数的TypeID
|
||||||
template <> class TypeToID<int[3]>; // 数组的TypeID
|
template <> class TypeToID<int[3]>; // 数组的TypeID
|
||||||
template <> class TypeToID<int (int[3])>; // 这是以数组为参数的函数的TypeID
|
template <> class TypeToID<int (int[3])>; // 这是以数组为参数的函数的TypeID
|
||||||
template <> class TypeToID<
|
template <> class TypeToID<int (ClassB::*[3])(void*, float[2])>; // 我也不知道这是什么了,自己看着办吧。
|
||||||
int (ClassB::*[3])(void*, float[2])>; // 我也不知道这是什么了,自己看着办吧。
|
|
||||||
```
|
```
|
||||||
|
|
||||||
甚至连 `const` 和 `volatile` 都能装进去
|
甚至连 `const` 和 `volatile` 都能装进去
|
||||||
|
|
Loading…
Reference in New Issue
Block a user