Я пытаюсь реализовать систему, похожую на the first described here. То есть, (ab) использование модификации vtable для изменения поведения объекта во время выполнения. Это часть моих попыток создать эффективную оболочку типа-типа в проекте C++, над которым я работаю.Получить таблицу vtable класса без объекта
пример, вы должны быть в состоянии получить доступ к нему, копируют виртуальные таблицы с использованием memcpy()
и this
указателя, как например:
void setType(const DataType& newType)
{
memcpy(this, &newType, sizeof(DataType));
}
Однако, у меня есть проблема с этим методом: у меня нет объекта целевого класса для копирования vtable из и не хотите создавать его, поскольку некоторые типы дорогостоящие для построения.
Есть ли способ получить доступ к vtable, который будет помещен в объект данного класса без объекта этого класса?
Было бы предпочтительнее, если бы оно было несколько портативным, но я в значительной степени смирился с тем, что он является специфичным для компилятора; как таковой, метод GCC/G ++ будет приемлемым, если нет другого варианта. Предположим также, что я заинтересован только в создании этого на довольно стандартных ОС и архитектурах.
Я использую C++ 11, если это поможет.
Редактировать: Я хочу быть совершенно ясным, я знаю, насколько опасен такой тип поведения. Меня больше интересует идея и, возможно, ее узкое приложение в очень контролируемых условиях, чем я в том, что это хорошая идея для программного обеспечения для производства, несмотря на то, что может предложить мое введение.
Несомненно, вам нужен экземпляр объекта В НЕКОТОРЫХ пунктах, так почему бы просто не изменить его ПОСЛЕ того, как он был создан? [Хотя кажется, что ужасная идея в целом изменить vtables, которая может даже не быть сохранена в записываемой памяти, а в наши дни компиляторы отслеживают объекты и пропускают доступ к vtable, если они «знают», что вызывать] –
Если вы wan 't изменить поведение экземпляров объектов во время выполнения, а реализовать [State Design Pattern] (https://sourcemaking.com/design_patterns/state/cpp/1). То, что вы хотите, невозможно в переносном режиме, компилятор не требуется для реализации динамического полиморфизма с использованием виртуальной таблицы при любом использовании стандарта C++. –
Две идеи: (1) PIMPL, где вы создаете объект без материала impl, чтобы получить vtable (используя для этого специальный ctor). Это облегчило бы создание «фиктивного» объекта только для vtable, а не для фактического использования. (2) Реализовать шаблонную фабричную функцию, которая имеет локальную статическую переменную, содержащую фиктивный экземпляр (вид singleton), чтобы получить vtable. Таким образом, у вас есть только один объект каждого типа, как ваш накладные расходы в целом, что, я думаю, все в порядке. (1 + 2) Они могут быть даже объединены, но я думаю, это не обязательно. – leemes