Refatorando com C ++ 11

Dado o novo conjunto de ferramentas fornecido por muitos programadores em c ++, visando a simplificação, expressividade, eficiência do código, percorra o código antigo e faça ajustes (alguns inúteis, outros bem-sucedidos) para atingir seus objetivos. Enquanto tenta não perder muito tempo com esses trabalhos e apenas fazer alterações não intrusivas e independentes, quais são as melhores práticas?

Deixe-me riscar o óbvio:

Usarauto para executar loops baseados no iterador:

for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite;     
++it);
// becomes
for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);

Usargravata para várias atribuições que produzem apenas linhas de código no estilo C (como atribuir vários valores em uma estrutura de uma só vez? )

a = 1;
b = 2; 
c = 3;
d = 4; 
e = 5;
// becomes
std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);

Para tornar uma classe não herdável, apenas declare-a como "final" e exclua o código que alcançou esse comportamentohttp://www.parashift.com/c++-faq/final-classes.html

Use a palavra-chave delete para ocultar explicitamente construtores / destruidores em vez de declará-los privados (por exemplo, código para criar objetos baseados em heap, objetos não copiáveis etc.)

Transforme functores triviais criados apenas para facilitar a execução de um único algoritmo STL emlambda funções (além de reduzir a confusão de códigos, você terá chamadas embutidas garantidas)

Simplifique o agrupamento RAII de um objeto usando apenas umponteiro inteligente

Livre-se do bind1st, bind2nd e use-oligar

Substitua o código escrito à mão pelos traços de tipo (Is_ptr_but_dont_call_for_const_ptrs <> e outros :)) pelo código padrão fornecido por<type_traits>

Pare de incluir cabeçalhos de aumento para funcionalidade agora implementada no STL (BOOST_STATIC_ASSERT vs static_assert)

Forneça mover semântica para as classes (embora isso não se qualifique como uma alteração suja / rápida / fácil)

Usarnullptr sempre que possível, em vez da macro NULL e livre-se do código que preenchia os contêineres de ponteiros com 0 convertidos para o tipo de objeto

std::vector<foo*> f(23);
for (std::size_t i(0); i < 23; ++i)
{ f[i] = static_cast<foo*>(0); }
// becomes
std::vector<foo*> f(23, nullptr);

Limpe os dados vetoriais acessando a sintaxe

std::vector<int> vec;
&vec[0];    // access data as a C-style array
vec.data(); // new way of saying the above

Substitua throw () pornoexcept (além de evitar a especificação de exceção obsoleta, você obtém alguns benefícios de velocidadehttp://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler @ 00.29.42)

void some_func() noexcept; // more  optimization options
void some_func() throw();  // fewer optimization options
void some_func() ;         // fewer optimization options

Substitua o código no qual você colocaria um tempory em um contêiner e esperava que o otimizador excluísse a cópia, com um"substituir" quando disponível, a fim de encaminhar perfeitamente o argumento e construir diretamente um objeto em um contêiner sem temporário.

vecOfPoints.push_back(Point(x,y,z)); // so '03
vecOfPoints.emplace_back(x, y, z);   // no copy or move operations performed
ATUALIZAR

A resposta de Shafik Yaghmour foi legitimamente premiado com a maior aceitação do público.

A resposta de R Sahu foi o meu aceito, porque ocombinação dos recursos que propõe captura aespírito de refatoração : tornar o código mais claro e limpo, mais simples e elegante.

questionAnswers(11)

yourAnswerToTheQuestion