我需要一種方法來獲取指向C++中對象開始的指針。該對象在模板內部使用,因此它可以是任何類型(多態或不),並且可能是使用多重繼承的對象。指向對象開始的指針(C++)
我發現this article它描述了一種在T是多態類型的情況下使用typeid和dynamic_cast來void *的方法(參見「Dynamic Casts」一節)。
這對MSVC非常有效,但是在GCC(4.x)上它似乎落在它的屁股上,並且在與非多態類型一起使用時吐出編譯器錯誤。
有誰知道一個辦法:
- 讓GCC的行爲本身,並評估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);
}
謝謝。
$ 10/5明─「[注:甲基類子對象可能有一個佈局(3.7)從同一類型的最派生對象的佈局不同甲基類子對象可能有一個多態行爲(。 12.7)與同一類型的大多數派生對象的多態行爲不同,基類子對象的大小可以爲零(第9章);但是,兩個子對象具有相同的類類型並且屬於同一個最大派生對象不能在同一地址(5.10)中分配。]「 – Chubsdad 2010-08-15 15:47:46
應該發生什麼'struct point {int x; int y; }; point * p = new point(); doSomethingWithInstance(&p->x);'? – 2010-08-15 15:50:16
Logan;這將是該函數的一個無效使用,它只能用於已經分配到堆上的實例 – 2010-08-15 15:58:30