• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c++primer记录(二) 模板

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
因为看得源码里有大量的类模板,所以补充下C++中模板的知识

模板:函数模板  类模板                                                                                             

1、p-536 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出;
    
   p-551 非类型模板实参必须时编译时常量表达式,例: 
    template <int hi, int wid>
    class Screen
{
    public: 
        Screen(int vhi, int vwid){} 
};
    ====>Screen<24, 80> hp2621; 

2、对于类模板,在外部实现成员函数时,需要加上
  
//非特化  p-548   
    template < typename Type >
    class COMPARE 
{
    public: 
        COMPARE(const Type&); 
};
template < typename Type >
COMPARE<Type>::COMPARE(const Type& value){}

//特化模板 p-568
    template <>
    class COMPARE<const char*>
{
    public: 
        COMPARE(void);
};
COMPARE<const char*>::COMPARE(const char* const& value){}

//特化成员函数 p-569
template <>
COMPARE<const char*>::COMPARE(const char* const& value){}


3、类模板中的友员声明
第一种:
    (1)非模板类   p-552
    (2)非模板函数 p-552
    template <typename Type> 
    class Bar
{
    friend class FooBar;  //(1)非模板类
    friend void fcn();    //(2)非模板函数
};

第二种:
    (1)一般类模板         p-552
    (2)一般函数模板       p-552
    (3)类模板的特定实例   p-553
    (4)函数模板的特定实例 p-553
---------------------------------------------------------------------------
(1)(2)
    template <typename Type> 
    class Bar
{
    template <typename T> friend class Foo1; //(1)一般模板类
    template <typename T> friend void temp1_fcn1(const T&); //(2)一般函数模板
};
---------------------------------------------------------------------------
---------------------------------------------------------------------------
(3)(4)
    template <typename T> class Foo2; //类模板声明
    template <typename T> void temp1_fcn2(const T&);//函数模板声明
    template <typename Type>
    class Bar
{
    friend class Foo2<char*>;
    friend void temp1_fnc2<char*>(char* const &);
};

4、成员模板
    当模板类或非模板拥有自己的类模板或函数模板的成员,这种成员成为成员模板
    成员模板不能为需函数(为验证)

5、函数模板的特化 
    template < typename Type >
    int compare(const Type &v1, const Type &v2)
    {
            return v1 < v2;
    }
//特化函数模板
//声明
    template <>
    int compare<const char*>(const char* const& v1, const char* const& v2);
//实现, 如果不小心略掉了"template <>",则成了重载, 意义就变了
    template <>
    int compare<const char*>(const char* const& v1, const char*  const& v2)
    {
            std::cout << "speci " << v1 << "    " << v2 << std::endl;
            //  return v1 > v2;
                return strcmp(v1, v2);
    }

6、类模板的部分特化(此记录未验证)
    如果类模板有一个以上的模板形参,若只需特化某些模板形参而非全部
    template < typename T1, typename T2>
    class some_template
{
};

//类模板部分特化
template < typename T1 >
class some_template<T1, int>
{
};

some_template<int, string>foo; //use template;
some_tempalte<string, int>bar; //use partial specialization
部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来
实例化类模板部分特化的成员 
因为看得源码里有大量的类模板,所以补充下C++中模板的知识

模板:函数模板  类模板                                                                                             

1、p-536 函数模板的类型参数可由编译器进行推断,也可以由用户显式的指定,类模板的类型参数必须显式的给出;
    
   p-551 非类型模板实参必须时编译时常量表达式,例: 
    template <int hi, int wid>
    class Screen
{
    public: 
        Screen(int vhi, int vwid){} 
};
    ====>Screen<24, 80> hp2621; 

2、对于类模板,在外部实现成员函数时,需要加上
  
//非特化  p-548   
    template < typename Type >
    class COMPARE 
{
    public: 
        COMPARE(const Type&); 
};
template < typename Type >
COMPARE<Type>::COMPARE(const Type& value){}

//特化模板 p-568
    template <>
    class COMPARE<const char*>
{
    public: 
        COMPARE(void);
};
COMPARE<const char*>::COMPARE(const char* const& value){}

//特化成员函数 p-569
template <>
COMPARE<const char*>::COMPARE(const char* const& value){}


3、类模板中的友员声明
第一种:
    (1)非模板类   p-552
    (2)非模板函数 p-552
    template <typename Type> 
    class Bar
{
    friend class FooBar;  //(1)非模板类
    friend void fcn();    //(2)非模板函数
};

第二种:
    (1)一般类模板         p-552
    (2)一般函数模板       p-552
    (3)类模板的特定实例   p-553
    (4)函数模板的特定实例 p-553
---------------------------------------------------------------------------
(1)(2)
    template <typename Type> 
    class Bar
{
    template <typename T> friend class Foo1; //(1)一般模板类
    template <typename T> friend void temp1_fcn1(const T&); //(2)一般函数模板
};
---------------------------------------------------------------------------
---------------------------------------------------------------------------
(3)(4)
    template <typename T> class Foo2; //类模板声明
    template <typename T> void temp1_fcn2(const T&);//函数模板声明
    template <typename Type>
    class Bar
{
    friend class Foo2<char*>;
    friend void temp1_fnc2<char*>(char* const &);
};

4、成员模板
    当模板类或非模板拥有自己的类模板或函数模板的成员,这种成员成为成员模板
    成员模板不能为需函数(为验证)

5、函数模板的特化 
    template < typename Type >
    int compare(const Type &v1, const Type &v2)
    {
            return v1 < v2;
    }
//特化函数模板
//声明
    template <>
    int compare<const char*>(const char* const& v1, const char* const& v2);
//实现, 如果不小心略掉了"template <>",则成了重载, 意义就变了
    template <>
    int compare<const char*>(const char* const& v1, const char*  const& v2)
    {
            std::cout << "speci " << v1 << "    " << v2 << std::endl;
            //  return v1 > v2;
                return strcmp(v1, v2);
    }

6、类模板的部分特化(此记录未验证)
    如果类模板有一个以上的模板形参,若只需特化某些模板形参而非全部
    template < typename T1, typename T2>
    class some_template
{
};

//类模板部分特化
template < typename T1 >
class some_template<T1, int>
{
};

some_template<int, string>foo; //use template;
some_tempalte<string, int>bar; //use partial specialization
部分特化可以具有与通用模板完全不同的成员集合,类模板的成员的通用定义永远不会用来
实例化类模板部分特化的成员 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#中调用SQL存储过程(带输入输出参数的例子)发布时间:2022-07-14
下一篇:
在 .NET 中创建快捷方式 [C#]发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap