any类型

c++是一种强类型的语言。对变量赋值时,如果类型不匹配,也不能隐式转换,编译就会报错。

在很多动态语言里,js,lua等,变量都是无类型的:

如:

var a = 3;

a = 3.1415;

a = “Hello”;

这样任意类型赋值都可以,这个a其实只是对它保存内容的一个引用。

c++要实现这样的类型有几种方式:

1. 定义一个巨大的union,把所有的类型都包含进去。

2. 把所有类型都转换成void*这种万能类型来保存,要用时由程序员来自己转换类型,这样效率看起来不错,但是类型不安全。

3. 区别对待各种类型,自己内部也知道保存的是什么类型的数据,嗯,类型安全。

boost::any就是第3种实现,挺强大的,有兴趣的同学可以看看源码。

不过我试试用第二种方式写了写一个any类,不过对原生类型int,char,float都需要写一个特殊方法才行,应该能用,不过比boost::any的实现要ugly多了。

 

 

#include <stdio.h>
#include <string>

using namespace std;

class any
{
private:
	void* _ptr;

public:
	template<typename T>
	any& operator = (T& t)
	{
		_ptr = (void*)&t;
		return *this;
	}

	any& operator = (int i)
	{
		_ptr = (void*)i;
		return *this;
	}

	template<typename T>
	friend T any_cost(any& a);
};


template<typename T>
T any_cost(any& a)
{	
	return *(static_cast<T*>(a._ptr));
}

template<>
int any_cost<int>(any& a)
{
	return (int)a._ptr;
}


void main(void)
{
	string s = "Hello";
	int i = 9;
	any a;
	
	a = 10;
	a = i;

	printf("%d\n", any_cost<int>(a));
	a = s;
	
	string str = any_cost<string>(a);
	printf(str.c_str());	
}
posted @ 2010-11-24 22:04  火月  阅读(902)  评论(0编辑  收藏  举报