From 6c918c77cd907ac753bf6ad4705f98e247f11865 Mon Sep 17 00:00:00 2001 From: wuye9036 Date: Tue, 15 Dec 2015 00:11:22 -0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=203.1=20=E8=8A=82?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=86=85=E5=AE=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/ReadMe.md b/ReadMe.md index 41f36d2..14993fd 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1788,6 +1788,33 @@ DoWork ii; 所有参数不足,即原型中参数`T1`没有指定的地方,都由T1自己的默认参数`void`补齐了。 +但是这个方案仍然有些美中不足之处。 + +比如,尽管我们默认了所有无效的类型都以`void`结尾,所以正确的类型列表应该是类似于``这样的形态。但你阻止不了你的用户写出类似于``这样奇怪的类型参数列表。 + +其次,假设这段代码中有一个函数,它的参数使用了和类模板相同的参数列表类型,如下面这段代码: + +```C++ +template struct X { + static void call(T0 const& p0, T1 const& p1); // 0 +}; + +template struct X { + static void call(T0 const& p0); // 1 +}; + +void foo(){ + X::call(5); // 调用函数 1 + X::call(5, 0.5f); // 调用函数 0 +} +``` + +那么,每加一个参数就要多写一个偏特化的形式,甚至还要重复编写一些可以共享的实现。 + +为了解决这几个问题,在C++11中,引入了变参模板(Variadic Template)。 + + + ###3.2 后悔药:SFINAE ###3.3 实战单元:获得类型的属性——类型萃取(Type Traits)