From c46a17c23fbc9cbf420606d86307336de2925bc1 Mon Sep 17 00:00:00 2001 From: Light-City <455954986@qq.com> Date: Fri, 27 Dec 2019 14:36:53 +0800 Subject: [PATCH] update --- modern_C++_30/compilerpoly/README.md | 13 ++++ modern_C++_30/compilerpoly/template.cpp | 82 +++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 modern_C++_30/compilerpoly/README.md create mode 100644 modern_C++_30/compilerpoly/template.cpp diff --git a/modern_C++_30/compilerpoly/README.md b/modern_C++_30/compilerpoly/README.md new file mode 100644 index 0000000..2dbd461 --- /dev/null +++ b/modern_C++_30/compilerpoly/README.md @@ -0,0 +1,13 @@ +# 编译期多态:泛型编程和模板入门 + +运行时多态通过利用接口或者虚函数实现,本节则主要阐述编译时多态。 + +>如果一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子,那么这只鸟就可以被当作鸭子。 + +鸭子类型使得开发者可以不使用继承体系来灵活地实现一些“约定”,尤其是使得混合不同来源、使用不同对象继承体系的代码成为可能。唯一的要求只是,这些不同的对象有“共通”的成员函数。这些成员函数应当有相同的名字和相同结构的参数(并不要求参数类型相同)。 + +在C++中实现鸭子类型可以通过模板或者说泛型编程。不管是类模板还是函数模板,编译器在看到其定义时只能做最基本的语法检查,真正的类型检查要在实例化(instantiation)的时候才能做。一般而言,这也是编译器会报错的时候。 + +> “动态”多态和“静态”多态的对比 + +“动态”多态解决的是运行时的行为变化—这个是无法在编译时确定的。“静态”多态或者“泛型”—解决的是很不同的问题,让适用于不同类型的“同构”算法可以用同一套代码来实现,实际上强调的是对代码的复用。 \ No newline at end of file diff --git a/modern_C++_30/compilerpoly/template.cpp b/modern_C++_30/compilerpoly/template.cpp new file mode 100644 index 0000000..29587c8 --- /dev/null +++ b/modern_C++_30/compilerpoly/template.cpp @@ -0,0 +1,82 @@ +// +// Created by light on 19-12-27. +// +#include +#include +#include + + +using namespace std; + +// 函数模板 +template +bool isEqual(T t1, T t2) { + cout << "函数模板" << endl; + return t1 == t2; +} + +// 函数模板全特化 +template<> +bool isEqual(const char *t1, const char *t2) { + cout << "函数模板全特化" << endl; + return strcmp(t1, t2); +} + +// 函数模板偏特化 C++不支持函数模板偏特化 可以重载解决 +//template +//bool isEqual(T a, double b) { +// cout << "函数模板偏特化" << endl; +// return a == b; +//} + +// 改为重载 下面是重载!!! 而不是偏特化! +template +bool isEqual(T a, double b) { + cout << "函数重载" << endl; + return a == b; +} + +/// ============================================================= + +// 类模板 +template +class comp { +public: + bool isEqual(T t1, T t2) { + cout << "类模板" << endl; + return t1 == t2; + } +}; + +// 类模板全特化 +template<> +class comp { +public: + bool isEqual(const char *t1, const char *t2) { + cout << "类模板全特化" << endl; + return strcmp(t1, t2); + } +}; + +// 类模板偏特化 +template +class comp { +public: + bool isEqual(T *t1, T *t2) { + cout << "类模板偏特化" << endl; + return strcmp(t1, t2); + } +}; + +int main() { + isEqual(1, 2); // 实例化的时候做类型检查 + isEqual(1, 2.1); +// isEqual(1.1, 2.1); // 模糊的! + isEqual("qwqw", "asd"); + comp c; + c.isEqual(10, 11); + comp cc; + cc.isEqual("he", "lo"); + comp p; + p.isEqual("he", "ll"); +}