Что делает этот код приведения 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).