Я предоставляю константные и неконстантные варианты функции-члена, где я повторно использую константную версию для реализации неконстантной версии, как описано в в этом ответе из книг Скотта Мейерса.
Версия const принимает аргумент типа:
const std::function< void (const Foo &) > &
vs неконстантный принимает аргумент типа:
const std::function< void ( Foo &) > &
В реализации я должен использовать reinterpret_cast
, потому что const_cast
не работает.
E.g.,:
const std::function< void (Foo &) > & Processor;
reinterpret_cast< const std::function< void (const Foo &) > & >( Processor );
vs
const std::function< void (Foo &) > & Processor;
const_cast< const std::function< void (const Foo &) > & >( Processor );
Разве это не было бы в духе того, для чего предназначен const_cast
? Является ли это просто упущением в определении языка, которое, возможно, будет исправлено в C ++ 2x, или const_cast
никогда не будет в духе вещей здесь?
Вот более полный код:
void Collection::ProcessCollection(const std::function< void (const Foo &) > & Processor) const
{
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 ] );
}
}
void Collection::ProcessCollection(const std::function< void (Foo &) > & Processor)
{
const Collection * constThis = const_cast< const Collection * >( this );
const std::function< void (const Foo &) > & constProcessor
= reinterpret_cast< const std::function< void (const Foo &) > & >( Processor );
constThis->ProcessCollection( constProcessor );
}
const_cast
относится к типу, а не к подтипу как часть сигнатуры параметров. - person Eljay   schedule 14.06.2019const_cast
аргументы, чтобы вы могли вызвать функцию. Ваш код пытается привести тип функции (который никогда не будет благословлен стандартом). - person M.M   schedule 14.06.2019< >
и предоставлены полные функции. - person WilliamKF   schedule 14.06.2019ProcessCollection
был шаблоном функции, принимающим Callable. За счет наличия кода в заголовке он стал более лаконичным, гибким и оптимизируемым. - person M.M   schedule 14.06.2019