В следующим примере:
static Ref<T> FromThis(T* data)
{
static_assert(alignof(T) <= alignof(RefMemoryBlockBase));
return Ref(
reinterpret_cast<RefMemoryBlockBase*>(
reinterpret_cast<char*>(data) - sizeof(RefMemoryBlockBase)
),
data
);
}
Структуры блоков памяти:
struct RefMemoryBlockBase
{
virtual ~RefMemoryBlockBase() = default;
std::atomic<uint32_t> References = 1;
};
template<typename T>
struct RefMemoryBlock : RefMemoryBlockBase
{
template<typename... TArgs>
RefMemoryBlock(TArgs&&... args):
Value(std::forward<TArgs>(args)...)
{}
T Value;
};