У меня есть объект класса A, который я хочу разместить в пользовательском объекте стека. Для этого я просто перемещаю указатель стека на столько байтов, сколько имеет размер объекта, и возвращаю его предыдущее значение:
class A : public B {}; //B is from a precompiled library
class stack {
public:
stack(void): _top(&_storage[0]) {}
template <typename T>
inline T* push(void) {
T* ptr = static_cast<T*>(_top);
_top += sizeof(T);
return ptr;
}
//...
private:
char _storage[1024];
char* _top;
};
stack _stack;
int main(int argc, char** argv) {
A* a = _stack.push<A>(); //ignore the lack of a constructor call
return 0;
}
Visual C++ просто говорит мне, что static_cast не может преобразовать char* в A*. Обычное приведение в стиле C не дает мне этой ошибки, но я бы предпочел быть более явным и избегать динамического приведения (A наследует от другого класса, но не вносит вклад в vtable, которого у него нет). Есть ли разница между ними в этом случае?