怎样实现模板类型参数的通用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值吗?