Browse Source

Add list of content

Add part of sample code.
Wu Ye 12 năm trước cách đây
commit
758bc2aefe
10 tập tin đã thay đổi với 1099 bổ sung0 xóa
  1. 22 0
      .gitattributes
  2. 163 0
      .gitignore
  3. 705 0
      CppTemplateTutorial.cpp
  4. 20 0
      CppTemplateTutorial.sln
  5. 89 0
      CppTemplateTutorial.vcxproj
  6. 33 0
      CppTemplateTutorial.vcxproj.filters
  7. 36 0
      ReadMe.md
  8. 8 0
      stdafx.cpp
  9. 15 0
      stdafx.h
  10. 8 0
      targetver.h

+ 22 - 0
.gitattributes

@@ -0,0 +1,22 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs     diff=csharp
+*.sln    merge=union
+*.csproj merge=union
+*.vbproj merge=union
+*.fsproj merge=union
+*.dbproj merge=union
+
+# Standard to msysgit
+*.doc	 diff=astextplain
+*.DOC	 diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot  diff=astextplain
+*.DOT  diff=astextplain
+*.pdf  diff=astextplain
+*.PDF	 diff=astextplain
+*.rtf	 diff=astextplain
+*.RTF	 diff=astextplain

+ 163 - 0
.gitignore

@@ -0,0 +1,163 @@
+#################
+## Eclipse
+#################
+
+*.pydevproject
+.project
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.classpath
+.settings/
+.loadpath
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# PDT-specific
+.buildpath
+
+
+#################
+## Visual Studio
+#################
+
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.sln.docstates
+
+# Build results
+[Dd]ebug/
+[Rr]elease/
+*_i.c
+*_p.c
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.vspscc
+.builds
+*.dotCover
+
+## TODO: If you have NuGet Package Restore enabled, uncomment this
+#packages/
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+
+# Visual Studio profiler
+*.psess
+*.vsp
+
+# ReSharper is a .NET coding add-in
+_ReSharper*
+
+# Installshield output folder
+[Ee]xpress
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish
+
+# Others
+[Bb]in
+[Oo]bj
+sql
+TestResults
+*.Cache
+ClientBin
+stylecop.*
+~$*
+*.dbmdl
+Generated_Code #added for RIA/Silverlight projects
+
+# Backup & report files from converting an old project file to a newer
+# Visual Studio version. Backup files are not needed, because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+
+
+
+############
+## Windows
+############
+
+# Windows image file caches
+Thumbs.db
+
+# Folder config file
+Desktop.ini
+
+
+#############
+## Python
+#############
+
+*.py[co]
+
+# Packages
+*.egg
+*.egg-info
+dist
+build
+eggs
+parts
+bin
+var
+sdist
+develop-eggs
+.installed.cfg
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+.coverage
+.tox
+
+#Translations
+*.mo
+
+#Mr Developer
+.mr.developer.cfg
+
+# Mac crap
+.DS_Store

+ 705 - 0
CppTemplateTutorial.cpp

@@ -0,0 +1,705 @@
+#include "stdafx.h"
+#include <vector>
+
+#define WRONG_CODE_ENABLED 0
+
+// 0. Basic Form
+namespace _0
+{
+	template <typename T> // Old fasion: template <class T>
+	class ClassA
+	{
+		T	a;
+		T*	b;
+		T foo();
+		void foo2(T const&);
+	};
+
+	template <int Sz>
+	class ClassB
+	{
+		int arr[Sz];
+	};
+
+	size_t a = sizeof(ClassB<3>);
+	size_t b = sizeof(ClassB<7>);
+
+	template <typename T> void FunctionA(T const& param)
+	{
+	}
+
+	template <typename T> T FunctionB()
+	{
+		return T();
+	}
+}
+
+// 1.1 Nested in Class
+namespace _1_1
+{
+	template <typename T> // Old fasion: template <class T>
+	class ClassA
+	{
+		T	a;
+		T*	b;
+		T foo();
+		template <typename U> void foo2(T const&, U const&);
+	};
+}
+
+// 1.2 Instanciating 1
+namespace _1_2
+{
+	_1_1::ClassA<int>				a;
+
+	#if WRONG_CODE_ENABLED
+	_1_1::ClassA<WhatTheFuck>		b;	// Wrong
+	_1_1::ClassA					c;	// Wrong
+	#endif
+}
+
+// 1.3 Instanciating 2
+namespace _1_3
+{
+	template <typename T>
+	class ClassB
+	{
+		T* a;
+	};
+
+	template <typename T>
+	class ClassC
+	{
+		T a;
+	};
+
+	struct StructA; // Declared but not be defined
+	ClassB<StructA> d;	// Right
+#if WRONG_CODE_ENABLED
+	ClassC<StructA> e;	// Wrong
+#endif
+}
+
+// 1.4 Specialization, Partial Specialization, Full Specialization
+namespace _1_4
+{
+	// Prototype of Templates I: Single Parameter
+	template <typename T> class ClassD
+	{
+		int a;
+	};
+
+	// Specialization: Write a pattern for matching
+	template <> class ClassD<int>			// 1. template <>			2. ClassD<int>
+	{
+		int b;
+	};
+	
+	template <> class ClassD<float>
+	{
+		int c;
+	};
+	
+	// Partial-Specialization: A partial pattern for matching
+	template <typename T> class ClassD<T*>	// 1. template <typename T>	2. ClassD<T*>
+	{
+		int d;
+	};
+	
+	template <> class ClassD<int*>			// 1. template <>			2. ClassD<T*>
+	{
+		int e;
+	};
+	
+	// Question:
+	
+	// ClassD<int>::?
+	// ClassD<float>::?
+	// ClassD<double>::?
+	// ClassD<double*>::?
+	// ClassD<int*>::?
+	// ClassD<int const*>::?
+	
+	// Prototype of Templates II: Multiple Parameter
+	template <typename T, typename U> class ClassE
+	{
+		int a;
+	};
+	
+	template <typename T, typename U> class ClassE<T, U*>
+	{
+		int b;
+	};
+	
+	template <typename T> class ClassE<T, int>
+	{
+		int c;
+	};
+	
+	template <typename T> class ClassE<T, int*>
+	{
+		int d;
+	};
+	
+	template <typename U> class ClassE<int, U>
+	{
+		int e;
+	};
+	
+	template <> class ClassE<int, int>
+	{
+		int f;
+	};
+	
+	// Question:
+
+	// ClassE<float, double>::?
+	// ClassE<float, int>::?
+	// ClassE<int, float>::?
+	// ClassE<int, int*>::?
+	// ClassE<int, int>::?
+}
+
+// 2.1 Function Specialization
+namespace _2_1
+{
+	// Overload is enabled but no partial-specialization
+	template <typename T> void foo(T const& x) {}
+	template <typename T> void foo(T& y) {}
+	void foo(int&) {}
+	void foo(int) {}
+
+	// Specialization or Overloading
+	template <> void foo<bool>(bool const& x) {}
+
+	// Overloading
+	template <typename T> void foo(T const*) {}
+
+	template <typename T, typename U> void foo2(T const&, U const&);
+
+#if WRONG_CODE_ENABLED
+	template <typename U> void foo2<int, U>(int const&, U const&);
+	template <typename T, typename U> void foo2<T, U>(int const&, U const&);
+#endif
+
+	// Overloading - Looks like partial specification
+	template <typename U> void foo2(int const&, U const&);
+	template <typename T, typename U> void foo2(T const*, U const&);
+
+	// Don't forgot
+	// T foo(...);
+
+	// Specialize types which cannot be inferred by parameter
+	template <typename UninferableT, typename InferableT>
+	UninferableT foo3(InferableT const&) { return UninferableT(); }
+
+	void test()
+	{
+		
+		int x = 5;
+		float y = 10.0f;
+		foo(y);
+		int const z = 5;
+		foo(z);
+		foo(true);
+		foo3<int>(0.0f);	// Specialize types which is uninferable.
+
+#if WRONG_CODE_ENABLED
+		foo(3);	// Ambigous
+		foo(x); // Ambigous
+#endif
+	}
+}
+
+// 2.2 Example: Derived from template.
+namespace _2_2
+{
+	template <typename T>
+	class ClassA
+	{
+		T x;
+	};
+
+	template <typename T>
+	class ClassB
+	{
+		T* x;
+	};
+	
+	template <typename T>
+	class ClassC: public ClassB<T>
+	{
+		T* x;
+	};
+	
+	ClassC<int> a;
+
+#if WRONG_CODE_ENABLED
+	class ClassC: public ClassA<ClassC>
+	{
+	};
+#endif
+	
+	class ClassD: public ClassB<ClassD>
+	{
+	};
+	
+	// ClassC =??= ClassD
+}
+
+// 3.1 Meta Switch-Case/If-Then-Else via Specialization
+namespace _3_1
+{
+	bool equal(int a, int b)
+	{
+		return a == b;
+	}
+	
+	// meta functions:
+	// bool equal0(TypeA, TypeB)
+	// {
+	//		return false;
+	// }
+	// bool equal1(TypeA, TypeA)
+	// {
+	//		return true;
+	// }
+	// equal(A, A) == equal1(A, A) == true
+	// euqla(A, B) == equal0(A, B) == false
+	template <typename T, typename U>
+	class Equal
+	{
+	public:
+		static bool const value = false;
+	};
+	
+	template <typename T>
+	class Equal<T, T>
+	{
+	public:
+		static bool const value = true;
+	};
+	
+	bool x = Equal<int, float>::value;
+	bool y = Equal<int, int>::value;
+}
+
+// 3.2 SFINAE: Substitution Failure Is Not An Error.
+namespace _3_2
+{
+	class ClassA
+	{
+	};
+
+	template <int Sz> struct Mark
+	{
+		char _[Sz];
+	};
+
+#if	WRONG_CODE_ENABLED
+	template <typename T>
+	Mark<1> TestIncrementAdd(T const& v)
+	{
+		T tmp = v;
+		++tmp;
+		return Mark<1>();
+	}
+
+	template <typename T>
+	Mark<2> TestIncrementAdd(T const& v)
+	{
+		return Mark<2>();
+	}
+
+	bool a = TestIncrementAdd( ClassA() ) ) == sizeof(Mark<1>);
+#endif
+
+	// Right case: From Wiki
+	class ClassB
+	{
+	public:
+		typedef int Marker;
+	};
+ 
+	template <typename T> void test(typename T::Marker) { }
+	template <typename T> void test(T) { }
+ 
+	void DoTest()
+	{
+		test<ClassB>(10);	// Call #1.
+		test<int>(10);		// Call #2. SFINAE for test(T::Marker).
+	}
+}
+
+// 3.3 Application: Type Traits
+namespace _3_3
+{
+	template <typename T, typename U> class is_same;
+	
+	
+	template <typename B, typename D> class is_base_of;
+	// is_base_of
+	// 1. B is class, D is also class.
+	// 2. D* could be convert to B*
+	// 3. B != D
+
+	// Fundamentals
+	typedef char Accepted;
+	typedef int  Rejected;
+
+	class B
+	{
+	};
+
+	class D: public B
+	{
+	};
+
+	class D2: public D
+	{
+	};
+
+	// Type is a class
+	template <typename T>
+	class is_class
+	{
+	private:
+		// SFINAE
+		template <typename U> static Accepted test( int U::* );
+		template <typename U> static Rejected test(...);
+
+	public:
+		static const bool value = sizeof( test<T>(0) ) == sizeof(Accepted);
+	};
+
+	bool a = is_class<int>::value;
+	bool b = is_class<B>::value;
+
+	// B* could be convert to D*
+	template <typename Source, typename Dest>
+	class Convertible
+	{
+	private:
+		// Not SFINAE
+		static Accepted test(Dest*);
+		static Rejected test(...);
+	public:
+		static const bool value = sizeof( test(static_cast<Source*>(NULL)) ) == sizeof(Accepted);
+	};
+
+	bool c = Convertible<B, D>::value;
+	bool d = Convertible<D, B>::value;
+	bool e = Convertible<B, int>::value;
+
+	// B != D
+	using _3_1::Equal;
+
+	template <typename Base, typename Derived>
+	class is_base_of
+	{
+	public:
+		static bool const value = 
+			is_class<Base>::value &&
+			is_class<Derived>::value &&
+			Convertible<Base, Derived>::value &&
+			!Equal<Base, Derived>::value;
+	};
+
+	bool f = is_base_of<B, D2>::value;
+	bool g = is_base_of<D2, D>::value;
+	bool h = is_base_of<B, int>::value;
+	bool i = is_base_of<float, int>::value;
+
+	// Questions:
+	// remove_reference
+	// remove_pointer
+	// remove all qualifiers
+}
+
+// 3.4 Application: "Recursive" and Meta-Programming
+namespace _3_4
+{
+	// sum a, a+1, ..., b-1, b
+	int basic_algo(int a, int b)
+	{
+		int result = 0;
+		for (int i = a; i <= b; ++i)
+		{
+			result += i;
+		}
+		return result;
+	}
+
+	// Template could not support variable
+
+	// sum [a, b] without variable
+	int recursive_algo(int a, int b)
+	{
+		if (a == b)
+		{
+			return b;
+		}
+		return a + recursive_algo(a+1, b);
+	}
+
+	// Translate to meta-programming
+	template <int a, int b>
+	class MetaSum
+	{
+	public:
+		static int const value = MetaSum<a+1, b>::value + a;
+	};
+
+	template <int a>
+	class MetaSum<a, a>
+	{
+	public:
+		static int const value = a;
+	};
+
+	int a = MetaSum<1, 10>::value;
+}
+
+// 3.5 Application: Meta-Fibonacci
+namespace _3_5
+{
+	template <int Index>
+	class Fibonacci
+	{
+	public:
+		static int const value = Fibonacci<Index - 1>::value + Fibonacci<Index - 2>::value;
+	};
+
+	template <>
+	class Fibonacci<0>
+	{
+	public:
+		static int const value = 0;
+	};
+
+	template <>
+	class Fibonacci<1>
+	{
+	public:
+		static int const value = 1;
+	};
+
+	int a = Fibonacci<8>::value;
+}
+
+// 4   Directive word: typename and template
+namespace _4
+{
+	// typename T::type x;
+	// ??? typename ???
+
+	// typename T::template U<type> x;
+	// ??? template ???
+
+	class ClassA
+	{
+	public:
+		typedef int NestedType;
+	};
+
+	class ClassB
+	{
+	public:
+		typedef ClassA::NestedType NestedType;
+	};
+
+	template <typename T>
+	class ClassC
+	{
+	public:
+#if WRONG_CODE_ENABLED
+		typedef T::NestedType NestedType;
+#endif
+		typedef typename T::NestedType NestedType;
+		typedef typename std::vector<T>::iterator iterator;
+	};
+
+	class ClassD
+	{
+	public:
+		template <typename U, typename V> class NestedType;
+	};
+
+	template <typename T>
+	class ClassE
+	{
+	public:
+		template <typename U> class NestedType;
+	};
+
+	template <typename T, typename U>
+	class ClassF
+	{
+#if WRONG_CODE_ENABLED
+		typedef typename T::NestedType<U> NestedType;
+#endif
+		typedef typename T::template NestedType<U, int> NestedType;
+		typedef typename ClassE<T>::template NestedType<U> NestedType2;
+	};
+
+	ClassC<ClassB> a;
+	ClassF<ClassD, float> b;
+}
+
+// 5.1 How to Construct Meta Operators
+namespace _5_1
+{
+	// Expression = Value/Data Structure + Operator/Operations
+
+	// Value in Templates:
+	//	 Integral Constant (bool, char, unsigned, ...)
+	//	 Type (typename)
+
+	// 1. Trick: Constant <--> Type
+	template <int i>
+	class int_
+	{
+	public:
+		static int const value = i;
+	};
+
+	int a = int_<5>::value;
+
+	// This trick could work with overloading
+	template <typename T>
+	void Do(T* obj, int_<2>)
+	{
+	}
+
+	template <typename T>
+	void Do(T* obj, int_<1>)
+	{
+	}
+
+	void foo()
+	{
+		Do( static_cast<int*>(nullptr), int_<1>() );
+	}
+
+	template <typename T, int i> void DoAnotherWay(T* obj)
+	{
+	}
+
+	// Boolean is more useful than integral in general.
+	template <bool v>
+	class bool_
+	{
+	public:
+		static bool const value = v;
+	};
+
+	typedef bool_<true>		true_;
+	typedef bool_<false>	false_;
+	
+#if WRONG_CODE_ENABLED
+	// Aha, function cannot support partial specialization.
+	template <typename T> void DoAnotherWay<T, 1>(T* obj) {}
+	template <typename T> void DoAnotherWay<T, 2>(T* obj) {}
+#endif
+
+	// 2. Operators:
+	// add
+	
+	template <typename T, typename U>
+	class add_
+	{
+	public:
+		typedef int_<T::value + U::value> type;
+		static int const value = type::value;
+	};
+
+#if WRONG_CODE_ENABLED
+	// conflict
+	template <int x, int y>
+	class add_
+	{
+	public:
+		typedef int_<x+y> type;
+		static int const value = type::value;
+	};
+#endif
+	template <int x, int y>
+	class add_c
+	{
+	public:
+		typedef int_<x+y> type;
+		static int const value = type::value;
+	};
+
+	typedef add_< int_<2>, int_<3> >::type sum;
+	int b = sum::value;
+
+	typedef add_< int_<2>, int_<3> >::type sum_c;
+	int c = sum_c::value;
+
+	// another solution
+	template <typename T, typename U>
+	class add2_: public int_<T::value+U::value>
+	{
+	};
+	int d = add2_< int_<2>, int_<3> >::value;
+
+	// Other operators: sub, not, or, and ...
+}
+
+// 5.2 Example of Meta Programming: Meta-Vector
+namespace _5_2
+{
+	// Array: elem[count]
+	// Meta Array ?
+
+	// Recursively Definition
+	// 'Null' terminated
+	template <typename HeadT, typename TailT>
+	class pair_
+	{
+		typedef HeadT head;
+		typedef TailT tail;
+	};
+
+	class Nil;
+	
+	// Try Use It to Definition
+	typedef pair_< int, pair_<float, pair_<double, Nil> > > vector_3;
+
+	template <typename T0, typename T1 = Nil, typename T2 = Nil, typename T3 = Nil>
+	class make_vector_
+	{
+		typedef pair_< T0, make_vector_<T1, T2, T3> > type;
+	};
+
+	template <>
+	class make_vector_<Nil, Nil, Nil, Nil>
+	{
+		typedef Nil type;
+	};
+
+	template <typename T0, typename T1 = Nil, typename T2 = Nil, typename T3 = Nil>
+	class vector_: public make_vector_<T0, T1, T2, T3>::type
+	{
+	};
+
+	typedef vector_<double, float, int> vector3;
+
+	// Let's meta-program further
+	//
+	// push_back	?	tip: push_back<Vector, Element>::type
+	// pop			?
+	// find			?
+	// size			?
+}
+
+// 6.1 Template-Template Class
+
+// 6.2 High order function, closure and STL allocator rebind
+
+int _tmain(int argc, _TCHAR* argv[])
+{
+	return 0;
+}
+

+ 20 - 0
CppTemplateTutorial.sln

@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CppTemplateTutorial", "CppTemplateTutorial.vcxproj", "{E86AB3E9-316E-4D00-BBA3-B7CEDFA99D62}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{E86AB3E9-316E-4D00-BBA3-B7CEDFA99D62}.Debug|Win32.ActiveCfg = Debug|Win32
+		{E86AB3E9-316E-4D00-BBA3-B7CEDFA99D62}.Debug|Win32.Build.0 = Debug|Win32
+		{E86AB3E9-316E-4D00-BBA3-B7CEDFA99D62}.Release|Win32.ActiveCfg = Release|Win32
+		{E86AB3E9-316E-4D00-BBA3-B7CEDFA99D62}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 89 - 0
CppTemplateTutorial.vcxproj

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{E86AB3E9-316E-4D00-BBA3-B7CEDFA99D62}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>CppTemplateTutorial</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="CppTemplateTutorial.cpp" />
+    <ClCompile Include="stdafx.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 33 - 0
CppTemplateTutorial.vcxproj.filters

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="stdafx.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="CppTemplateTutorial.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>

+ 36 - 0
ReadMe.md

@@ -0,0 +1,36 @@
+
+#  C++ Template 进阶指南
+
+## 0. 前言
+
+## 1. Template的基本语法
+
+###1.1 Template Class的基本语法
+###1.2 Template Function的基本语法
+###1.3 整型也可是Template参数
+###1.4 类中类:灵活的模板定义
+
+## 2.  模板世界的If-Then-Else:特化与偏特化
+###2.1 实例化/特化类模板:从类模板到可以定义变量的具体类
+###2.2 类模板的匹配规则:特化与部分特化
+###2.3 函数模板的重载、特化与部分特化
+###2.4 技巧单元:模板与继承
+
+## 3   拿起特化的武器,去写程序吧!
+###3.1 利用模板特化规则实现If-Then-Else与Switch-Case
+###3.2 特化可以有多个选择:替换失败并不是一个错误,只是一种可能
+###3.3 技巧单元:获得类型的属性 ———— 类型萃取(Type Traits) 
+
+## 4   用模板写程序吧!骚年!
+## 4.1 模板上的递归
+## 4.2 实战单元:元编程的Fibonacci数列
+## 4.3 技巧单元:typename与template的另一种用法
+## 4.4 实战单元:撰写你自己的元编程“函数”库
+## 4.5 实战单元:实现元编程上的数据结构 ———— 以Vector为例
+
+## 5   关于模板,你还需要知道的其它常识
+###5.1 Template-Template Class
+###5.2 技巧单元:高阶函数 ———— 从函数到函数的组合
+###5.3 实战单元:STL中的Allocator Rebinder
+
+## 6   结语

+ 8 - 0
stdafx.cpp

@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// CppTemplateTutorial.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file

+ 15 - 0
stdafx.h

@@ -0,0 +1,15 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#include <stdio.h>
+#include <tchar.h>
+
+
+
+// TODO: reference additional headers your program requires here

+ 8 - 0
targetver.h

@@ -0,0 +1,8 @@
+#pragma once
+
+// Including SDKDDKVer.h defines the highest available Windows platform.
+
+// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
+// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
+
+#include <SDKDDKVer.h>