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
ATUALIZARA 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.