参数自动选择引用类型还是值类型
来源:互联网 发布:python量化投资 视频 编辑:程序博客网 时间:2024/05/16 09:42
对于泛型编程而言,不知道类型的大小,就不好判断选择传递参数时该选择值类型还是引用类型.对int,char这样的型别运用引用反到会使效率降低.下面是参考C++设计新思维的一个实现.
首先是一个型别选择器,根据flag标志判断是选择T,还是选择U,通过模板特化,当flag为true时选择T,当flag为false时选择U
template<bool flag, typename T, typename U>
class typeSelect
{
public:
typedef T Result;
};
template<typename T, typename U>
class typeSelect<false,T ,U>
{
public:
typedef U Result;
};
然后是一个把引用类型还原成原始类型的类,比如说把int&,还原成int.这样是为了防止出现引用的引用这种情况.它也是通过模板特化实现的.
template<typename T>
class referenceToOriginal
{
public:
typedef T Type;
};
template<typename T>
class referenceToOriginal<T&>
{
public:
typedef T Type;
};
sizeCompare也是这里的一个辅助类,如果传入的类型的大小大于第二个模板参赛传入的类型,这MORE为true,否则为false.第二个模板参数默认为8,如果测试觉得不合适,可以更改.
不能直接比较
template<typename T, int size = 8>
class sizeCompare
{
public:
enum{ MORE = sizeof(T) > size };
};
最后就是根据与传进的大小比较,选择类型
template<typename T,int size = 8>
class valOrRef
{
typedef typename referenceToOriginal<T>::Type U;
public:
typedef typename typeSelect<sizeCompare<U,size>::MORE,U&,U>::Result Type ;
};
}
在使用的时候
template<typename T>
void Fun(typename valOrRef<T>::Type t)
{
}
template<typename T>
class Test
{
typedef typename valOrRef<T>::Type type;
public:
void output(type t)
{
cout<<t<<endl;
}
};
int main()
{
typedef valOrRef<int>::Type type;
typedef valOrRef<string>::Type stype;
//stype c; 会报错“c”: 必须初始化引用,说明这里选择的是引用类型
type a = type();//不会报错,说明选择的是值类型
string str("test");
Test<int> tint;
tint.output(a);
Test<string> tstr;
tstr.output(str);
Fun<int>(a);
Fun<string>(str);
}
这样模板类Test可以根据模板参数决定output的参数类型是值类型还是引用类型.
但也有一个缺陷,在使用模板函数的时候不能实现类型的自动推导
必须像
Fun<int>(a);
Fun<string>(str);
这样指明类型才可以调用,很不方便.
- 参数自动选择引用类型还是值类型
- string 值类型还是引用类型?
- String是值类型,还是引用类型
- 值类型和引用类型参数
- 关于string是值类型还是引用类型
- 关于string是值类型还是引用类型- -
- 关于string是值类型还是引用类型
- net中String是引用类型还是值类型
- net中String是引用类型还是值类型
- net中String是引用类型还是值类型
- String是值类型还是引用类型(C#)
- Net中String是引用类型还是值类型
- net中String是引用类型还是值类型
- string 是值类型,还是引用类型(.net)
- C#中的DateTime是值类型还是引用类型
- Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?
- 引用类型做参数。。。
- 引用类型参数
- 解决“浏览器的缓存已满,可能会影响您对Gmail的使用”的方法
- 游戏中经济的看法
- CSDN的牛人在看什么书
- 2006.11.02.今天开始进入角色
- 关于SQL导入导出的方法大全(从网上摘抄)
- 参数自动选择引用类型还是值类型
- Mysql数据库远程不能连的2个主要原因
- 关于游戏中玩家间的互动
- MySQL数据库配置技巧
- VIJOS P1234 口袋的天空 Accepted
- Strategy模式学习笔记
- VC常用开发技巧
- 2006年Java One大会10大Java SE 分会场
- 如何屏蔽掉 php一些函数?