欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一个神奇的???whatever~~

程序员文章站 2022-06-01 20:17:54
...

一个神奇的类,用来封装消息数据,统一数据传递接口,从unity引擎源码拷贝而来。


#include <iostream>
#include <assert.h>
#include <crtdefs.h>



struct MessageData
{
	int type;
private:
	// Note: on Metro WinRT types cannot be located in union, so don't use union!
	intptr_t data;
	
public:
	MessageData ()
	{ 
		data = 0; type = 0; 
	}

	template<class T>
	void SetData (T inData, int classId)
	{
		// Check if SetData is used instead of SetScriptingObjectData 
		//assert (type !=-1);
		//assert (sizeof (T) > sizeof (data)); // increase the data size
		*reinterpret_cast<T*> (&data) = *reinterpret_cast<T*> (&inData);
		type = classId;
	}

	template<class T>
	T GetData ()
	{
		// Check if GetData is used instead of GetScriptingObjectData 
		assert (type != -1);
		return *reinterpret_cast<T*> (&data);
	}

	intptr_t& GetGenericDataRef ()
	{
		// Check if GetGenericDataRef is used instead of GetScriptingObjectData 
		assert (type != -1);
		return data;
	}
};


class test
{
public:
	test(int x)
	{
		m_date = x;
	}

	void print()
	{
		std::cout<<m_date<<std::endl;
	}

private:
	int m_date ;
};

int main()
{
	MessageData data;
	test t(4);
	data.SetData(&t, 2);


	test * tt = data.GetData<test*>();
	tt->print();
	return 0;
}