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());	
}

转载于:https://www.cnblogs.com/hj046/archive/2010/11/24/1887092.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值