【B2B研发商城】 【加入收藏】 【设为首页】 【进入论坛】 【站点地图】

你的位置:中国研发网 >> 技术文章 >> 开发语言 >> C/C++ >> 详细内容 在线投稿

C++ 模板基础知识

排行榜 收藏 打印 发给朋友 举报 来源: 互联网   发布者:未知
热度134票  浏览45次 【共0条评论】【我要评论 时间:2009年11月06日 17:16
1.关键字typename
在C++标准化过程中,引入关键字typename是为了说明:模板内部的标识符可以是一个类型,譬如下面的例子:

template<typename T>
class MyClass{
    typename T::SubType * ptr;
    ...
};
//需要补充具体的例子

2.template构造

考虑下面标准bieset模板的例子
template<int N>
void printBitset(std::bitset<N> const& bs)
{
    std::cout<<bs.template to_string<char,char_traits<char>,allocator<char>>();
}
只有编辑器判断小于号<之前,存在依赖于模板参数的构造,才会出现这种问题。

3.模板的模板参数

template<typename T,
    typename <typename ELEM,
            typename ALLOC = std::allocator<ELEM>>
            class CONT = std::deque>
class Stack{
private:
    CONT<T> elems;
    ...
}

4.零初始化

对于int、double或者指针等基本类型,并不存在用一个有用的缺省值来对他们进行初始化的缺省构造函数,任何

未被初始化的局部变量都具有一个不确定的值

借助如下代码,我们可以确保对象已经执行了适当的缺省初始化,即使对内建类型对象也是如此
template <typename T>
void Foo()
{
    T x=T();
}

5.用字符串做为函数模板的实参

把字符串传给模板的引用参数会导致出人意料的结果,考虑下面的程序

#include <string>

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

int main()
{
    std::string s;
    ::max("apple","peach");//ok,相同类型的实参
    ::max("apple","tomato");//error,不同的类型实参
}
解释:"apple"的类型为char const[6],"peach"的类型为char const[6],"tomato"的类型为char const[7]
-------------------------------------------------------
1.
成员函数模板不能被声明为虚函数,模板类的普通成员可以使虚函数
2.
模板实参的一个普遍约束是:在程序创建时,编译器或链接器要能够确定实参的值,如果实参的值等到运行时才能确定(譬如,局部变量的地址),就不符合模板是在程序创建时初始化的概念
另一方面,有些常值不能作为有效地非类型实参,这些类型包括:空指针常量,浮点型值
TAG: 基础 模板 知识
顶:6 踩:5
对本文中的事件或人物打分:
当前平均分:-0.64 (42次打分)
对本篇资讯内容的质量打分:
当前平均分:0.57 (47次打分)
【已经有34人表态】
5票
感动
4票
路过
4票
高兴
5票
难过
3票
搞笑
3票
愤怒
5票
无聊
5票
同情
上一篇 下一篇
发表评论

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】