怎样实现模板类型参数的通用null?

chiny 2006-10-12 10:42:39
null在这表示不存在,不是point = NULL表示空指针.

首先看一段Java的例子


package a;

public class A<T> {

private T value;

public T getValue() {
if (false)
return value;
else
return null;
}
public A(T value)
{
this.value = value;
}
public static void main(String[] args) {
A<Integer> a = new A<Integer>(19);
if (a.getValue() == null)
System.out.println("Can't get value(int)!");
A<String> s = new A<String>("case");
if (s.getValue() == null)
System.out.println("Can't get value(string)!");
}

}

输出:

Can't get value(int)!
Can't get value(string)!

这儿的null可以表示任何类型的null值


c++版的例子

//a.hpp
#ifndef CBY_A_HPP
#define CBY_A_HPP

namespace cby
{
template <typename T>
class A
{
public:
A(const T value):value(value)
{
#ifdef TPL_NONE_VALUE
NONE = TPL_NONE_VALUE;
#endif
}
A(const T value,const T none_value):value(value),NONE(none_value){}
T getValue()
{
if (false)
return value;
else
return NONE;
}
private:
T NONE;
T value;
};
}

#endif

//main.cpp
//the lowest opposite integer instead of NONE
#define TPL_NONE_VALUE -(1<<31)
#include "a.hpp"

int main()
{
cby::A<int> a(20);
int value = a.getValue();
if (value == TPL_NONE_VALUE)
cout << "can't get value(int)!" << endl;
//这儿没法使用A<string> sa("case"),因为NONE值已经
//被TPL_NONE_VALUE定义为整形,会导致cast。只能适用
//传入一个默认null值。
cby::A<string> sa("case","NONE");
string sv = sa.getValue();
if (sv == "NONE")
cout << "can't get value(string)!" << endl;
return 0;

}


整段c++代码显得很别扭,极不方便。

我想过指针有一个万能null值,尝试过改造以下代码。

T* getValue() //changed here
{
if (false)
return &value;//changed here
else
return NONE;
}
private:
static T* NONE = NULL; //changed here
T value;

然后调用

void* p;
p = a.getValue();
if (p)
{
int* pi = (int*) p;
......operation on pi.....
}

但是有个问题,指针p指向A里面的value,导致A::value被暴露。

难道c++就没有一个通用的null来表示任何对象的null值吗?




...全文
248 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2006-10-12
  • 打赏
  • 举报
回复
楼主此处应该是示例代码吧。
if(false),flase是关键字,不需要定义,if永远不成立,走else分支。
sharkoasis 2006-10-12
  • 打赏
  • 举报
回复
请问一下大家,if(false);是什么代码啊,false是bool变量?怎么没定义?
sinall 2006-10-12
  • 打赏
  • 举报
回复
嗯,taodm(taodm)方法不错。
返回std::pair<const T&, bool>,就完美了。

再来一个方法:
bool getValue(T& t)
{
if (flag != false)
t = value;
else
t = NONE;

return flag;
}
sinall 2006-10-12
  • 打赏
  • 举报
回复
但是有个问题,指针p指向A里面的value,导致A::value被暴露。
——那你可以返回const指针啊。
const T* getValue() //changed here
{
if (false)
return &value;//changed here
else
return NULL;
}
taodm 2006-10-12
  • 打赏
  • 举报
回复
呵呵,return T(),抛出异常,或者返回类型改为pair<bool, T>
确实,c++没有一个通用的null来表示任何对象的null值
sinall 2006-10-12
  • 打赏
  • 举报
回复
^_^,我也遇到过这个问题。对这个问题,有如下解决方法。
1)你的第二种方法,我觉得就不错。
2)你的第三种方法,不如直接返回NULL:
T* getValue() //changed here
{
if (false)
return &value;//changed here
else
return NULL;
}
3)抛出异常
T getValue()
{
if (false)
return value;
else
throw Non_Found_Exception;
}
sharkoasis 2006-10-12
  • 打赏
  • 举报
回复
哦,明白了,相当于if(0);我说看着怎么这么怪呢!一时糊涂了!
sinall 2006-10-12
  • 打赏
  • 举报
回复
唉,我就是一直不爽map::operator[],读取的时候,不存在你就返回“空”嘛,干吗还要插入呢?-_-!!!
genius_hb 2006-10-12
  • 打赏
  • 举报
回复
记得有本书上讲过一个类似的东西?effective c++吧

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧