函数模板与范式编程

1.为什么要引入类模板与函数模板?

        在日常的维护中,因为面对不同的数据可能需要执行相同的任务(如比较大小,交换),如果为每一种数据都写一个函数则会浪费大量的精力,引入范式编程这可以解决这个问题。

        首先来看一个小例子,对不同的数据类型的两个数进行交换:

        范式代码实现:

#include<iostream>

using namespace std;

template <typename T>
T swaping(T &a, T &b) {//标准命名空间下,本身存在一个swap函数,尽量避免名称的冲突
	T temp = NULL;
	temp = a;
	a = b;
	b = temp;
	return 0;
  }
    这样的一个函数,可以对任意数据类型的两个参数进行交换。这便是c++所谓的函数模板。
    所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
    定义函数模板的一般格式:
     ```
    template<类型参数列表>
    类型  函数名(形参列表){
    剩余语句块
}
        
       _ 模板参数_可以根据我们传递的实参来决定,如果我们传递了两个int给参数类型T const&,那么C++编译器得出结论:每个T都必须正确的匹配,如果此时传递的实参为:max(4, 4.2),则出现编译错误

        有3种方法来处理上面的错误:

        1、对实参进行强制类型转换,使它们可以互相匹配:

            max(static_cast<double>(4), 4.2);

        2、显示指定(或限定)T的类型:

            max<double>(4, 4.2)

        3、指定两个参数可以具有不同的类型



        //函数模板的重载

        inline int max(const int &a, const int &b) {
	        return a > b ? a : b;
        }

        template<typename T>
        inline const T& max(T &a, T &b) {
	        return a > b ? a : b;
        }

        template<typename T>
        inline const T& max(T &a, T &b, T &c) {
	        return a > (b > c ? b : c) ? a : (b > c ? b : c);
        }


        //模板类

        template<typename T>
        class myclass {
        public:
        	myclass() {
	        	cout << "A new instance is created!" << endl;
	        }
    
	        ~myclass() {
	        	cout << "destructor is called!" << endl;
	        }

	        void change(T a, T b) {
	        	this->_a = a;
	        	this->_b = b;
        	}

	        void print() {
	        	cout << this->_a << endl;
        		cout << this->_b << endl;
        	}

        private:
        	T _a = 0;
        	T _b = 0;
        };


        int main() {
	        //int a = 3;
	        //int b = 5;
    
	        //char a = 'a';
	        //char b = 'c';
	        //swaping(a,b);
	        //cout << "a==" <<a<< endl;
	        //cout << "b==" <<b<<endl;
	        //return 0;

	        //int a = 3;
	        //int b = 5;
	        //int c = 3.4;
	        //cout<<::max(a, b)<<endl;
	        //cout << ::max(a, c) << endl;
	        //cout << ::max(a, b, c) << endl;

	        myclass<int> test;
	        test.change(3, 5);
	        test.print();

	        myclass<char> test2;
	        test2.change('a', 'c');
	        test2.print();
        }

转载于:https://my.oschina.net/u/3641281/blog/1572965

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当谈到面向模板编程时,我们通常是指C++中的模板编程(Template Metaprogramming,TMP)。模板编程是一种在编译时进行的编程方式,基于C++模板机制。它通过使用模板参数和特化等技术,使得程序可以在编译期间进行一些复杂的计算和类型操作。 在面向模板编程中,我们可以使用模板来定义通用的算法和数据结构,使其适用于不同类型的数据。通过使用模板参数,我们可以实现代码的通用性,而不需要为每种类型都编写重复的代码。这种泛型编程的特性使得我们可以更高效地复用代码,并提高程序的可维护性。 另一方面,高阶函数编程是一种编程范式,其中函数被视为“一等公民”,可以像其他数据类型一样被操作和传递。高阶函数编程强调函数的组合和转换,可以将一个或多个函数作为参数传递给另一个函数,并返回一个新的函数作为结果。 在高阶函数编程中,函数可以作为参数传递给其他函数,也可以作为返回值返回。这种能力使得代码更加简洁、模块化和可重用。高阶函数编程还支持一些特性,如闭包、柯里化和函数组合等,这些特性使得函数的组合和转换更加灵活和强大。 高阶函数编程通常与函数编程语言(如Haskell、Clojure等)相关联,但在C++中,我们也可以使用一些技巧来实现类似的高阶函数编程的效果,如使用函数指针、函数对象(Functor)和Lambda表达式等。这使得我们能够在C++中使用一些高阶函数编程的特性,如映射、过滤、折叠等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值