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::type>(value))
BYTE byData[256];256文字の配列です コードfunction(byData);function(boost::any T)boost::anyの実行開始コンストラクション関数が呼び出されると、ポインタBYTE*ではなくbyData[256]となる.コード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はポインタです.したがって、通常の出力は、配列名が表すヘッダアドレスと最初の要素のアドレスは同じですが、Boostが自動的に導出するため、パラメータが配列名byDataと&byData[0]が同じとは思わないでください.boost::anyクラスを使用する場合は、メモリを動的に割り当ててデータを格納し、boost::anyではこのメモリへのポインタを保存すればよい.