Quando descobri boost::lexical_cast
, pensei comigo mesmo "por que não soube disso antes!" - Eu odiava ter que escrever código como
stringstream ss;
ss << anIntVal;
mystring = ss.str();
Agora eu escrevo
mystring = boost::lexical_cast<string>(anIntVal);
Ontem, no stackoverflow, me deparei com boost split (outra gema que me salvará de escrever código).
string stringtobesplit = "AA/BB-CC")
vector<string> tokens;
boost::split(tokens, stringtobesplit, boost::is_any_of("/-"));
// tokens now holds 3 items: AA BB CC
Vou começar a procurar na documentação do boost procurando outras funções que poderei usar regularmente, mas acho que será muito fácil perder coisas.
Quais funções de impulso você mais usa / odiaria não ter?
Respostas:
Provavelmente, a parte mais usada do boost para mim é boost :: shared_ptr .
fonte
std::shared_ptr
estd::unique_ptr
.BOOST_FOREACH faz a vida valer a pena novamente.
(Por que ninguém mencionou isso? A pergunta foi feita há 8 meses!)
fonte
Meus favoritos são, em nenhuma ordem particular:
O Boost foi de grande ajuda quando escrevi meu primeiro aplicativo multiplataforma - sem ele eu realmente teria lutado.
fonte
Eu gosto de como você pode fornecer seu próprio destruidor para
shared_ptr
.Isso significa, por exemplo, que você pode usá-lo com
FILE*
e fazer com que ele feche o arquivo para você.por exemplo
fonte
NULL
é inútil, pois atribui o parâmetro da função local. :)Ninguém mencionou os Contêineres de Índice Múltiplo, então irei gritar tarde. Não é tão frequente que você precise deles, mas sem impulso é muito difícil criar uma estrutura de dados equivalente, além de ser menos eficiente. Eu tenho usado muito recentemente para criar contêineres que pesquisam 2 chaves.
fonte
Estou surpreso que ninguém tenha mencionado
boost::optional
. Eu me pego usando com mais frequência do que qualquer parte do Boost, excetoshared_ptr
escoped_ptr
.fonte
std::experimental::optional
breve (C ++ 17?) Comostd::optional
.Ninguém menciona boost :: tuple? Por vergonha!
fonte
std::tuple
.BOOST_STATIC_ASSERT
Atualização (outubro de 2011): C ++ 11 (C ++ 0x) tem
static_assert
http://www2.research.att.com/~bs/C++0xFAQ.html#static_assertfonte
Um dos meus mais usados não é o Boost propriamente dito, mas o Adobe Source Libraries (ASL) construídas sobre o Boost - especificamente, as extensões dos algoritmos padrão que aceitam boost :: range no lugar de iteradores de início / fim separados. Então, em vez de ligar, diga,
Posso simplesmente dizer
(Espero que essas partes do ASL migrem para o Boost eventualmente.)
fonte
Eu uso muito:
Outros como Tuple, Static Assert e Integer são muito úteis se você estiver escrevendo uma biblioteca que será usada em uma variedade de plataformas.
Coisas como Graphs e Lambda são mais específicas.
fonte
boost::shared_ptr
é um requisito para IMHO de programação C ++ moderno. É por isso que o adicionaram ao padrão com TR1.boost::program_options
,,boost::bind
eboost::signal
são muito legais se você souber para que servem e como usá-los. Os dois últimos tendem a assustar os recém-chegados.fonte
Achamos o boost :: spirit muito útil para uma solução de negócios para analisar ECMAScript. Complexo, mas muito bom!
fonte
Estou surpreso por não ver ainda entre as respostas Boost.Thread .
fonte
std::thread
.Eu uso o shared_ptr há anos. É tão útil que não há razão para que um projeto fique sem ele.
Além disso, também uso Bind / Function / Lambda para mecanismos de retorno de chamada genéricos - especialmente úteis ao testar - bem como Formato para minha substituição de sprintf de uso geral.
Finalmente, foi outro dia quando usei Variant com raiva para resolver um problema (um analisador que poderia responder com um pequeno conjunto fixo de tipos de tokens não relacionados). A solução foi muito elegante e estou muito feliz com ela.
Anos se passaram e os tempos mudaram, então é hora de uma atualização. SharedPtr e Function agora fazem parte do Standard, e Bind e Lambda são obsoletos pela funcionalidade lambda real em nível de linguagem.
Eu ainda uso o Variant (que também foi padronizado, mas não estou lá ainda), Format foi amplamente substituído por fmtlib (que também foi padronizado).
A grande parte do Boost que uso é o Boost.Asio. Que está em processo de padronização.
fonte
Usando tuplas para iterar um mapa, assim:
Usando atribuição de impulso, posso inicializar um mapa como este:
E usando adaptadores de alcance e o operador de tubo ("|"), posso iterar de trás para frente nos valores de um mapa (como exemplo):
fonte
Você deve verificar boost :: program_options. Isso torna a análise da linha de comando muito mais fácil.
fonte
Eu uso Boost Pointer Containers em vez de um contêiner STL de
shared_ptr
s.fonte
Eu uso boost :: numeric :: ublas :: matrix um pouco.
fonte
Eu adoro boost :: random and boost :: asio e boost :: filesystem, no entanto boost :: bind, boost :: circular_buffer e boost :: thread são muito práticos, ponteiros inteligentes estão ok, mas eu prefiro RAII em vez de gerenciamento de memória
fonte
Ok, aqui está um novo que descobri: em
vez de usar stricmp , posso usar a função equals de boost e passar o predicado is_iequal,
por exemplo: em
vez de
Eu posso usar
dado:
fonte
Aqui estão meus dois centavos:
fonte
eu uso
boost::icl
bastante para pós-processamento de texto. Economizei muito tempo porque, do contrário, eu mesmo teria que implementar a divisão de texto ...BOOST_FOREACH
está em todo lugar no meu código :)boost::function
eboost::bind
são uma necessidade absoluta. Embora agora eles sejamstd::function
estd::bind
. Isso realmente ajuda a reduzir a quantidade de código desnecessário e geralmente é bom para meus projetos (ou minhas ilusões).Recentemente comecei a usar
boost::interprocess::message_queue
e esta é uma ótima ferramenta também.Eu usaria muito mais, mas o Qt tem maneiras nativas de fazer muitas coisas que o Boost faz. Se algum dia eu tiver que programar C ++ puro, acho que me tornaria um
boost::junkie
:)fonte
O que eu mais uso agora está disponível no TR1:
Agora eu também uso classes de pool e algumas outras coisas mais específicas.
Você entende agora que Boost se destina a ser útil para a maioria dos programadores, é por isso que é a base de teste para a futura biblioteca padrão.
fonte
Falando sobre boost :: lexical_cast, por que algo como 'format' não é um membro estático na biblioteca std :: string?
Quase todos os gui libs têm algo como CString :: Format ("% i") ou QString :: Number ("% i") que retorna uma string inicializada.
fonte
std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Acho que a questão deve ser revertida. Qual parte de seu impulso você não gostaria de usar?
Em minha experiência, praticamente tudo isso é interessante e útil em cada domínio de problema.
Você deve passar um tempo examinando toda a documentação do boost para encontrar as áreas que cobrem seus interesses.
Uma exceção pode ser
boost::numeric::ublas
que faz seu trabalho, mas Eigen o faz muito melhor.fonte