reinterpret_cast
здесь неопределенное поведение. const_cast
не подходит, потому что const
ness параметров шаблона не то, что вы можете отбросить.
Самый простой способ решить это, ну, не надо. Избавьтесь от некоторых ссылок. Поменяйтесь, кто его реализует.
void Collection::ProcessCollection(std::function< void (const Foo &) > Processor) const
{
Collection * mutableThis = const_cast< Collection * >( this );
mutableThis->ProcessCollection( Processor );
}
void Collection::ProcessCollection(std::function< void (Foo &) > Processor)
{
for( int idx = -1 ; ++idx < m_LocalLimit ; )
{
if ( m_Data[ idx ] )
{
Processor( m_Data[idx] );
}
}
const int overflowSize = OverflowSize();
for( int idx = -1 ; ++idx < overflowSize ; )
{
Processor( (*m_Overflow)[ idx ] );
}
}
std::function
хранит вещи, которые совместимы с ним.
Если вы берете Foo&
, вы можете вызвать функцию, ожидающую Foo const&
с ним. Таким образом, вы можете хранить std::function<void(Foo const&)>
в std::function<void(Foo&)>
.
Завершение чего-либо в std::function
может включать в себя распределение. Таким образом, вы можете найти высококачественный function_view<Sig>
, чтобы заменить использование std::function
.
В другом комментарии вы заявляете, что этот код находится в критическом цикле. Полное устранение std::function
- это хороший шаг или, по крайней мере, уменьшение количества нажатий на стирание типа и передача ему данных каким-либо образом.
Инверсия const / unfst все еще уместна; мы реализуем const в терминах изменяемого, а не изменяемого в терминах const, потому что одна - ковариантная операция, другая - контравариантная операция. Смотрите здесь .