Что делает этот код приведения C++?

Найдено здесь: https://github.com/tpaviot/oce/blob/master/src/BRepAdaptor/BRepAdaptor_Curve.cxx

Интересующая меня строка:

((GeomAdaptor_Curve*) (void*) &myCurve)->Load(C,First,Last);

myCurve уже определен как GeomAdaptor_Curve, Похоже, что он указывает на myCurve как void*и затем разыграть это как GeomAdaptor_Curve*, а затем разыменовывая его и вызывая Load в теме. Какая возможная причина может быть для этого, а не просто позвонить myCurve.Load?

2 ответа

Решение

Обратите внимание, что заявление появляется в const функция-член. Так что тип &myCurve на самом деле GeomAdaptor_Curve const*, Это кажется уродливым и запутанным способом сказать

const_cast<GeomAdaptor_Curve&>(myCurve).Load(C,First,Last);

и, возможно, было сделано более сложным, чтобы "избежать" предупреждений компилятора, которые вы получите, пытаясь использовать приведение в стиле C для обхода const,

Единственная причина, о которой я мог подумать, - это убедиться, что переменная типа "подкласс GeomAdaptor_Curve"был вынужден позвонить Load функция суперкласса.

Актерский состав void*затем на GeomAdaptor_Curve*, будет гарантировать, что тип был обработан как последний, независимо от его фактического типа.

Изучив код, я не могу понять, где это возможно, поэтому вполне вероятно, что это либо устаревший код, либо что-то, что они вставили для будущего расширения.

Возможно, стоит связаться с dbarbier Пользователь на GitHub, поскольку он, как представляется, несет единоличную ответственность за изменения (на основе истории).

Несмотря на то, что этот фрагмент кода, по-видимому, присутствует в самых ранних версиях GitHub, первоначальный автор может быть лучшим выбором, если вы сможете их найти (см. Заголовок файла для одного Remi LEQUETTE).

Другие вопросы по тегам