| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 616 人关注过本帖
标题:[求助]关于模板信息特化
只看楼主 加入收藏
Satyr
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2006-4-7
收藏
 问题点数:0 回复次数:6 
[求助]关于模板信息特化

里面都解释了
不会了

x6veJSYa.rar (6.99 KB) [求助]关于模板信息特化


[此贴子已经被作者于2006-11-26 11:59:58编辑过]

搜索更多相关主题的帖子: 特化 模板 
2006-11-26 11:59
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
好问题
期待

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-11-28 13:34
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
只需要把
template <class T>
struct Isptr<T *>
{
enum{result=true};
};
改成
template <class T>
struct Isptr<T *>
{
enum{result=true};
typedef T baseType;
};

分配内存的那一段
template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new (*T)[33];//这里可以这么解决么??
//这里我知道用局部特化解决当T为char*的情况,,不过他只能是唯一的,
//char*局部特化解决为 Array=(char **)new char*[size]; for(){*Array[i]=new char[size]}
//要是我传入的不是char*,而是其他类型的指针呢,只能一个一个特化,失去了模板意思
//因此我想用针对信息特化,不过我就不知道这里应该怎么解决分配空间问题。
}
}
}

改成

template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new Isptr<T>::baseType[33];
}
}
}

由于我的firefox不能发附件,下面把test.h的内容都贴出来了,
#include <iostream>
using namespace std;

const int size=8;
template <class T>
struct Isptr
{
enum{result=false};
};

template <class T>
struct Isptr<T *>
{
enum{result=true};
typedef T baseType;
};

template <class T>
class test
{
protected:
T *Array;
public:
test();
~test();
void display()const;
void clean_up();
};

template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new Isptr<T>::baseType[33];
}
}
}

template <class T>
void test<T>::clean_up()
{
if(Isptr<T>::result)
{
for(int i=0;i<size;i++)
delete []Array[i];
}
}

template <class T>
test<T>::~test()
{
clean_up();
delete []Array;
}

template <class T>
void test<T>::display()const
{
cout<<Array;
}


2006-11-28 16:32
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
以下是引用litcatyx在2006-11-28 16:32:31的发言:
只需要把
template <class T>
struct Isptr<T *>
{
enum{result=true};
};
改成
template <class T>
struct Isptr<T *>
{
enum{result=true};
typedef T baseType;
};

分配内存的那一段
template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new (*T)[33];//这里可以这么解决么??
//这里我知道用局部特化解决当T为char*的情况,,不过他只能是唯一的,
//char*局部特化解决为 Array=(char **)new char*[size]; for(){*Array[i]=new char[size]}
//要是我传入的不是char*,而是其他类型的指针呢,只能一个一个特化,失去了模板意思
//因此我想用针对信息特化,不过我就不知道这里应该怎么解决分配空间问题。
}
}
}

改成

template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new Isptr<T>::baseType[33];
}
}
}

由于我的firefox不能发附件,下面把test.h的内容都贴出来了,
#include <iostream>
using namespace std;

const int size=8;
template <class T>
struct Isptr
{
enum{result=false};
};

template <class T>
struct Isptr<T *>
{
enum{result=true};
typedef T baseType;//这个意思是例如传char*,那么T在这里是char,而如果在外部其他地方T就是char *了,对吧
//好方法,感觉可行。我没编译器,不会没测试的代码吧,来骗我幼小心灵
};

template <class T>
class test
{
protected:
T *Array;
public:
test();
~test();
void display()const;
void clean_up();
};

template <class T>
test<T>::test()
{
if(Isptr<T>::result)
{
Array=(T*)new T[size];
for(int i=0;i<size;i++)
{
Array[i]=new Isptr<T>::baseType[33];
}
}
}

template <class T>
void test<T>::clean_up()
{
if(Isptr<T>::result)
{
for(int i=0;i<size;i++)
delete []Array[i];
}
}

template <class T>
test<T>::~test()
{
clean_up();
delete []Array;
}

template <class T>
void test<T>::display()const
{
cout<<Array;
}


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-11-28 17:24
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
但是LZ那个方法我也感觉可行啊
为什么不行呢??
*T不就解开指针变成类型了么

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-11-28 17:26
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
Array[i]=new (*T)[33];

编译器不认呀,*是给指针解引用,可不是给类型解引用

2006-11-28 20:57
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

看来我学的太‘活’了,基本语法都不知道了


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-11-29 20:18
快速回复:[求助]关于模板信息特化
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025670 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved