answer here在 C++17 中不适用于此模式:
template <typename Processor>
void Collection::ProcessCollection(Processor & 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 ] );
}
}
// How to avoid this repetition for non-const version?
template <typename Processor>
void Collection::ProcessCollection(Processor & 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 ] );
}
}
由于传递给 lambda Processor
的参数是常量且与其签名不匹配。
最佳答案
您可以将函数分解为一个静态模板,然后在两个模板中使用它。我们可以使用模板生成这两个函数:
struct Collection {
// ...
template<typename Processor>
void ProcessCollection(Processor& processor) {
ProcessCollectionImpl(*this, processor);
}
template<typename Processor>
void ProcessCollection(Processor& processor) const {
ProcessCollectionImpl(*this, processor);
}
template<typename T, typename Processor>
static void ProcessCollectionImpl(T& self, Processor& processor) {
for( int idx = -1 ; ++idx < self.m_LocalLimit ; )
{
if ( self.m_Data[ idx ] )
{
processor( self.m_Data[idx] );
}
}
const int overflowSize = self.OverflowSize();
for( int idx = -1 ; ++idx < overflowSize ; )
{
processor( (*self.m_Overflow)[ idx ] );
}
}
};
T&
将根据 *this
的常量推导 Collection&
或 Collection const&
关于c++ - 如何使用 lambda 避免代码重复 const 和非常量集合处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56602770/