Поверхностное копирование объекта в D

Поверхностное копирование объекта можно осуществить весьма хитроумным способом, который мы нашли в интернете (к сожалению, найдено было давно и мы не смогли установить точного автора, а ссылку потеряли):

extern (C) Object _d_newclass(ClassInfo info);

// поверхностное копирование объекта
template shallow_copy (T : Object)
{
	T shallow_copy (T value)
	{
		if (value is null)
			return null;
		
		void* copy = cast(void*) _d_newclass(value.classinfo);
		size_t size = value.classinfo.init.length;
		
		copy[0 .. size] = (cast(void*) value)[0 .. size];
		return cast(T) copy;
	}
}

Этот шаблон является довольно интересной идеей, хотя задача поверхностного копирования объектов не так уж и распространена.

Добавить комментарий