找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 711|回复: 6

[求助]关于模板信息特化

[复制链接]
发表于 2009-11-4 01:21:46 | 显示全部楼层 |阅读模式 IP:江苏扬州
里面都解释了
不会了



附件: 只有本站会员才能下载或查看附件,请您 登录 或 注册
发表于 2009-11-4 01:21:47 | 显示全部楼层 IP:江苏扬州
好问题
期待
回复

使用道具 举报

发表于 2009-11-4 01:21:48 | 显示全部楼层 IP:江苏扬州
只需要把
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;
}
回复

使用道具 举报

发表于 2009-11-4 01:21:49 | 显示全部楼层 IP:江苏扬州
以下是引用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;
}
回复

使用道具 举报

发表于 2009-11-4 01:21:50 | 显示全部楼层 IP:江苏扬州
但是LZ那个方法我也感觉可行啊
为什么不行呢??
*T不就解开指针变成类型了么
回复

使用道具 举报

发表于 2009-11-4 01:21:52 | 显示全部楼层 IP:江苏扬州
Array[i]=new (*T)[33];

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

使用道具 举报

发表于 2009-11-4 01:21:53 | 显示全部楼层 IP:江苏扬州
看来我学的太‘活’了,基本语法都不知道了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 01:31 , Processed in 0.240799 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表