boost::any 使用注意问题

boost::any 使用注意问题

flyfish 
 编译环境  VC2010

看如下代码

void function(boost::any T)
{
try 
	{  
	
		BYTE* src=boost::any_cast<BYTE*>(T);
	
		for (int i=0;i<4;i++)
		{
			CString str;
			str.Format(_T("%d"),src[i]);
			AfxMessageBox(str);
		}
		
	}  
	catch(boost::bad_any_cast & e)  
	{  
		//e.what();		
	} 
}


初始化
	BYTE byData[256];
	for (int i=0;i<256;i++)
	{
		byData[i]=i;
	}


调用方式

方式1: function(&byData[0]);
方式2: function(byData);

1.56.0版boost::any 构造函数
any(const ValueType & value)
          : content(new holder<BOOST_DEDUCED_TYPENAME decay<const ValueType>::type>(value))


BYTE byData[256];它是包含256个字符的数组
 代码 function(byData);
当调用function(boost::any T) boost::any的开始执行构造函数时,就变成了byData[256],不是指针 BYTE*。


代码 function(&byData[0]); 
boost::any的开始构造时,使用的就是byData[0]。所以正常输出


如果将栈使用方式BYTE byData[256]; 更改为堆使用方式 BYTE* byData=new BYTE[256];
function(&byData[0]); 和function(byData);都可以正常运行


而采用堆使用方式 BYTE* byData=new BYTE[256];这时候byData就是指针了。所以正常输出
虽然数组名代表的首地址和第一个元素的地址是相同,但不要认为任何时候参数为数组名byData和&byData[0] 是相同的,因为Boost会自动推导的。
使用boost::any类时只要动态分配内存存放数据,而boost::any中则保存指向这块内存的指针就可以了。




你可能感兴趣的:(boost,any,boostany)