Мне нужен способ получить указатель на начало объекта в C++. Этот объект используется внутри шаблона, поэтому он может быть любым типом (полиморфным или нет) и потенциально может быть объектом, который использует множественное наследование.Указатель на начало объекта (C++)
Я нашел this article, который описывает способ его выполнения (см. Раздел «Динамические касты») с использованием typeid и dynamic_cast для void * в случае, когда T является полиморфным типом.
Это отлично работает на MSVC, однако на GCC (4.x) он, похоже, падает на свою задницу и выплевывает ошибку компилятора, когда используется с не полиморфным типом.
Кто-нибудь знает путь к:
- Сделать НКУ вести себя, и оценить TypeId правильно
- Или другой способ сделать это, что будет компилировать на GCC
Ниже код, который я использую для этого.
template <typename T>
void* dynamicCastToVoidPtr(T *const ptr)
{
// This is done using a separate function to avoid a compiler error on some
// compilers about non-polymorphic types when calling startOfObject
return dynamic_cast<void*>(ptr);
}
template <typename T>
void* startOfObject(T *const ptr)
{
// In cases of multiple inheritance, a pointer may point to an offset within
// another object
// This code uses a dynamic_cast to a void* to ensure that the pointer value
// is the start of an object and not some offset within an object
void *start = static_cast<void*>(ptr);
if(start)
typeid(start = dynamicCastToVoidPtr(ptr), *ptr);
return start;
}
template <typename T>
void doSomethingWithInstance(T *const instance)
{
// Here is where I need to get a void* to the start of the object
// You can think of this as the deleteInstance function of my memory pool
// where the void* passed into freeMemory should point to the
// start of the memory that the memory pool returned previously
void *start = startOfObject(instance);
if(start)
allocator->freeMemory(start);
}
Thanks.
$ 10/5 states- «[Примечание: Базовый класс подобъектом может иметь компоновку (3.7), отличную от расположения наиболее производный объект того же типа Базовый класс подобъектом может иметь полиморфное поведение (. 12.7) отличается от полиморфного поведения самого производного объекта того же типа. Субобъект базового класса может иметь нулевой размер (раздел 9), однако два подобъекта, которые имеют один и тот же тип класса и которые принадлежат одному и тому же самому производному объекту не должно выделяться по тому же адресу (5.10).] " – Chubsdad
Что должно произойти с' struct point {int x; int y; }; точка * p = новая точка(); doSomethingWithInstance (&p->x); '? –
Логан, это было бы недопустимым использованием функции. Оно должно использоваться только с экземплярами, которые были выделены в куче. –