【步兵 c++】 多态&模板

本文深入探讨了C++中的函数模板和类模板应用,通过具体示例展示了如何利用模板提高代码复用性和简洁性。介绍了模板的基本语法,并演示了其实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【步兵 c++】 多态&模板 by EOS.

函数模板和类模板,是多态的另一种表现,它赋予了一个函数或者类多种表现。
下面我们直接举例说明吧。


函数模板

template<class T>
inline bool isString(const T& str)
{
    string typeName = (typeid(T).name());
    if (typeName.find("basic_string") != -1 || typeName.find("char ") != -1)
        return true;
    return false;
};
//下面代码函数模板中加了一些输出, 输出了下typeName和true false。

测试代码
int main()
{
    isString(123);
    isString(123.f);
    isString(123.0);
    isString("123");
    string s = "12323";
    isString(s);
    const char* ss = "123";
    isString(ss);
    isString("1");
    isString('1');
    return 0;
}
    //输出为:
    //int    false
    //float  false
    //double     false
    //char[4]    true
    //class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char> >  true
    //char const *   true
    //char[2]    true
    //char   false

上面代码可以看出,通过函数模板,我们只用了一个声明就可以接收任何类型的参数。
和N个强类型函数声明相比,无疑显示出了模板的优势。
可读性更强代码更简洁,不用写连篇的重载,也节约了我们的体力。

注:模板函数声明和实现要写在一起,先声明后实现将会出问题。

接下来写一个模板类的例子


模板类

template<class T>
class Items
{
public:
    Items(int size):idx(0), len(size) {
        _arr = new T[size];
    };
    ~Items() {
        delete[] _arr;
    };

    void push(const T& v) { 
        assert(idx != len);
        _arr[idx] = v;
        ++idx;
    };

    T& pop() {
        assert(idx != 0);
        --idx;
        return _arr[idx];
    };

    //如果只读模式,返回应为 const T&
    T& operator [](int i){
        assert(i >= 0 && i < idx);
        return _arr[i];
    };

private:
    T* _arr;
    int idx;
    int len;
};

//测试代码
int main()
{
    Items<int> xx(3);
    xx.push(123);
    xx.push(321);
    xx.push(233);

    auto n = xx.pop();
    cout << n << endl;
    cout << xx[0] << endl;
    xx[1] = 666;//如果返回const T&,这里将报错,常量不能作为左值
    n = xx.pop();
    cout << n << endl;
    return 0;
}

//输出为:
//233
//123
//666

这里只是实现了一个简单功能,跟 STL 比起来,九牛一毛了,
但也体现了一种管理的思想,同时也体现出了类模板的特点:极度提高了代码的复用性。
因为他可以是任意类型的(比如我们常用的vector),却只有一个class的定义。


题外话

说实话,类模版很少会用到,主要是因为STL太强大了,基本能满足开发需求。
而函数模版应该值得我们多思考的,当多种数据类型,进行同种操作时,
我们应该第一时间想到函数模版,比如:

我们非常讨厌NULL,因为他经常会让我们的程序崩溃,那么我们就行当一个值是NULL的时候,
我们就去一个有实际意义值来代替他,让我们程序正常运行。

template<class T>
inline T& getDefined(T& a, T& b)
{
    return a ? a : b;
};

char* defualt = "c++";

char* p = NULL;
auto x = getDefined(p, defualt);
cout << x << endl;//输出 c++

char* p2 = "c#";
 x = getDefined(p2, defualt);
cout << x << endl;//输出 c#

好了,就写这么多。

See Again~
之前
真爱无价,欢迎打赏~
赞赏码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值