Quais recursos do Boost se sobrepõem ao C ++ 11?

191

Coloquei minhas habilidades em C ++ na prateleira há vários anos e parece que agora, quando preciso delas novamente, o cenário mudou.

Temos o C ++ 11 agora, e meu entendimento é que ele se sobrepõe a muitos recursos do Boost.

Existe algum resumo de onde estão essas sobreposições, quais bibliotecas do Boost se tornarão herdadas, recomendação de quais recursos do C ++ 11 usar em vez dos de otimização e quais não?

user377178
fonte
4
O Boost foi um dos primeiros a implementar a biblioteca TR1. Como agora está no padrão, você deve preferir a versão padrão. O Boost.Lambda também é substituído por lambdas reais agora.
Kerrek SB
6
O artigo da Wikipedia sobre C ++ 11 tem um bom resumo da maioria das alterações.
Algum programador,

Respostas:

285

Substituível por recursos ou bibliotecas da linguagem C ++ 11

TR1 (eles estão marcados na documentação se forem bibliotecas TR1)

Recursos portados em C ++ 11:

  • Atomic ← std :: atomic
  • Chrono ← <chrono> (veja abaixo)
  • Mover ← Referências de valor

Substituível pelos recursos da linguagem C ++ 17:

A equipe padrão ainda está trabalhando nisso:

Uma grande parte do MPL pode ser reduzida ou removida usando modelos variados. Alguns casos de uso comum do elenco Lexical pode ser substituído por std :: to_string e std :: sto X .

Algumas bibliotecas do Boost estão relacionadas ao C ++ 11, mas também têm mais extensões, por exemplo, o Boost.Functional / Hash contém hash_combine e funções relacionadas não encontradas no C ++ 11, o Boost.Chrono tem E / S e arredondamento e muitos outros relógios, etc., portanto, você ainda pode querer dar uma olhada nos de impulso antes de realmente descartá-los.

kennytm
fonte
1
Adicionar à lista Boost.Chrono , Boost.Exception e Boost.Swap .
ildjarn
9
Observe que o Boost.Lambda (ou melhor, os lambdas do Boost.Phoenix), ainda são úteis para lambdas polimórficas.
Xeo 13/01/12
2
Nice lista, embora eu não acredito que std::unique_ptré parte do TR1 (uma vez que exige semântica Move)
Nemo
1
@ildjarn: O Boost.Chrono oferece muito mais funções que o <chrono>. Exceção de Boost - somente o N2179 é relevante.
Kennytm
2
@ Nemo: Sim. Apenas std :: tr1 :: shared_ptr é parte do TR1, e const std :: unique_ptr substitui os casos de uso de boost :: scoped_ptr e boost :: scoped_array
kennytm
55

Na verdade, não acho que as bibliotecas de impulso se tornem legadas.

Sim, você deve ser capaz de usar std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie, std::beginem vez de Typetraits reforço / Utility, Boost ponteiro inteligente, Boost Tuple, bibliotecas Boost Gama, mas não deve, na prática, há real necessidade de 'switch', a menos que você está se movendo mais seu código para c ++ 11.

Além disso, na minha experiência, as stdversões da maioria delas são um pouco menos úteis. Por exemplo, AFAICT, o padrão não possui

  • Expressões regulares do Perl5
  • call_traits
  • Certos membros da interface regex (como bool boost::basic_regex<>::empty()) e outras diferenças de interface
    • isso morde mais, já que a interface do Boost é exatamente compatível com o Boost Xpressive
    • e funciona muito mais bem com os algoritmos Boost String Obviamente, os últimos ainda não possuem contrapartes padrão (ainda?)
  • Muitas coisas relacionadas ao TMP (Boost Fusion)
  • Preguiçosos, lambdas baseados em modelos de expressão; eles têm benefícios inevitáveis, pois podem ser polimórficos hoje , em oposição ao C ++ 11. Portanto, eles geralmente podem ser mais sucintos:

     std::vector<int> v = {1,2,-9,3};
    
     for (auto i : v | filtered(_arg1 >=0))
         std::cout << i << "\n";
    
     // or:
     boost::for_each(v, std::cout << _arg1);

    Definitivamente, isso ainda tem algum apelo sobre lambdas C ++ 11 (com tipos de retorno à direita, captura explícita e parâmetros declarados).

Além disso, há um papel GRANDE para o Boost, precisamente para facilitar a migração de caminho do C ++ 03 para o C ++ 11 e integrar as bases de código C ++ 11 e C ++ 03. Estou pensando particularmente em

  • Aumentar Automático (BOOST_AUTO)
  • Utilitário Boost ( boost::result_of<>e relacionado)
  • Aumentar o Foreach (BOOST_FOREACH)
  • Não se esqueça: Boost Move - que permite escrever classes com semântica de movimento com uma sintaxe que será compilada igualmente bem em compiladores C ++ 03 com os compiladores Boost 1_48 + e C ++ 11.

Apenas meus $ 0,02

ver
fonte