C++练习之template操作

C++模板(template)在应用中也是很广泛,我理解的模板就是该类或者该函数可以塞入不同的数据类型,而能正确处理。

源码下载地址:git clone https://laneyu@bitbucket.org/laneyu/cplusplus.git

template目录下有本文章的完整例子

一、类模板(class templates

1、简单使用

类模板允许类里面的函数、变量等等使用模板参数(template parameters)作为数据类型使用,如下所示:

template <typename T>

class mypair

{

public:

    mypair(T first, T second)

    {

        values_[0] = first;

        values_[1] = second;

    }

 

    void output()

    {

        std::cout <<values_[0] <<" " <<values_[1] <<std::endl;

    }

private:

    T values_[2];

};

因此,使用template方式,该类则可以适用于不同的类型,如:int, char, long等等。

如,使用该类存储两个int类型的实例

mypair<int> myobject (115, 36);

存储两个double类型的实例

mypair<double> myfloats (3.0, 2.18);

 

具体测试例子参考template2.cpp

 

2、类模板成员函数的使用

当我们需要在模板class外部定义相应的成员函数时,其和普通类使用起来有一定的区别,这是需要注意的地方,如下所示getMax函数

template <typename T>

class mypair

{

public:

    mypair(T first, T second)

    {

        values_[0] = first;

        values_[1] = second;

    }

 

    T getMax();

 

    void output()

    {

        std::cout <<values_[0] <<" " <<values_[1] <<std::endl;

    }

private:

    T values_[2];

};

 

下面解释下getMax的语法:

template <class T>

T mypair<T>::getmax ()

此处,总共三个T,第一个T是模板参数(template parameter),如果定义了两个模板,则为(T1, T2),参考一下例子,第二个参数是函数返回类型,第三个T也是需要的,指明成员函数模板参数也是class模板参数。

 

具体测试例子参考template3.cpp

 

3、多个类模板的使用

有时候我们可以定义多个不同的类型,如下面的TT2

template <typename T, typename T2>

class mypair

{

public:

    mypair(T first, T second, T2 z)

    {

        values_[0] = first;

        values_[1] = second;

        z_ = z;

    }

 

    void output()

    {

        std::cout <<values_[0] <<" " <<values_[1]  <<" " <<z_ <<std::endl;

    }

private:

    T values_[2];

    T2 z_;

};

 

因此,TT2可以是不同类型,也可以是相同类型,如Tint, T2char类型,等等。

 

具体测试例子参考template4.cpp

 

4、模板定制化(Template specialization

从前面可以知道采用templateclass,在处理所有类型数据,如int, double,处理方式都是一样的。考虑这样的一个钟情况,我们在对一个类的里面数据进行increase的时候,如果是int类型,那么可以直接+1,但是如果是char类型,那么我们涉及到大小写字母处理就和int等类型处理方式不一样?因此,此处我们需要对char类型进行定制,采用另外的方式进行处理。如下所示:

//class template specialization

template <>

class mycontainer <char>

{

public:

        mycontainer(char element)

            : element_(element)

            {}

        char uppercase()

        {

            if ((element_>='a')&&(element_<='z'))

                element_+='A'-'a';

            return element_;

        }

 

        char lowercase()

        {

            if ((element_>='A')&&(element_<='Z'))

                element_-='A'-'a';

            return element_;

        }

    

        void output()

        {

            std::cout <<element_<<std::endl;

        }

 

private:

    char element_;

};

 

解释下template specialization的语法:

template <> class mycontainer <char> { ... };

前缀template<> template parameters的参数列表为空,当为空时代表template specialization

注意类名后面,如此处的<char>,代表着该类是个char类型 template class

需要区分下以下两种定义:

template <class T> class mycontainer { ... };

template <> class mycontainer <char> { ... };

 

第一个是一般的template class,第二个是specialization

具体测试例子参考template5.cpptemplate6.cpp

 

参考资料:

http://www.cplusplus.com/doc/tutorial/templates/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值