Boost의 가장 많이 사용되는 부분 [닫힌]


115

내가 발견했을 때 나는 boost::lexical_cast"왜이 사실을 더 빨리 알지 못 했는가!"라고 생각했습니다. -나는 다음과 같은 코드를 작성하는 것이 싫었다.

stringstream ss;
ss << anIntVal;
mystring = ss.str();

이제 나는 쓰기

mystring = boost::lexical_cast<string>(anIntVal);

어제 stackoverflow에서 부스트 분할 (코드 작성을 저장하는 또 다른 보석)을 발견했습니다.

string stringtobesplit = "AA/BB-CC")
vector<string> tokens;

boost::split(tokens, stringtobesplit, boost::is_any_of("/-")); 
// tokens now holds 3 items: AA BB CC

정기적으로 사용할 수있는 다른 기능을 찾기 위해 부스트 문서를 살펴 보려고하는데, 놓치기 쉬운 일이있을 것 같습니다.

가장 많이 사용하는 부스트 기능은 무엇입니까?


1
흥미롭게도 Boost를 사용하기 전에 "숫자를 문자열로 변환"함수를 작성하지 못했던 이유는 무엇입니까? 복제를보고 간단한 템플릿을 작성하고 사용한 다음 발견했을 때 부스트 버전으로 전환했을 것입니다.
Len Holgate

4
안녕 렌, 다른 프로젝트에서 다른 시간에 템플릿 화 된 "ToStr"함수를 작성했지만 다른 프로젝트로 넘어 가서 결국 3 줄을 작성하게됩니다. ) "misc_funcs"파일을 생성하는 오버 헤드와 반대로
hamishmcn

답변:


62

아마도 저에게 가장 많이 사용되는 부분은 boost :: shared_ptr 입니다.


13
또한 아마도 가장 많이 사용됩니다. 참조, 포인터 컨테이너 및 auto_ptr에 의해 shared_ptr의 대부분의 사용법을 리팩토링해야하는 어려운 방법을 직접 배웠습니다. 나는 지금 대부분 이것에 동의한다 : bureau14.fr/blogea/index.php/2009/08/…
amit

1
@phaedrus : 업데이트 링크 : blogea.bureau14.fr/index.php/2009/08/...
MatthewD

4
더 이상 관련 C ++에서 11있는 없습니다 std::shared_ptrstd::unique_ptr.
einpoklum

49

BOOST_FOREACH 는 삶을 다시 가치있게 만듭니다.

(왜 아무도 이것을 언급하지 않았습니까? 질문은 8 개월 전에 질문되었습니다!)


15
"조건부 사랑"에 대한 Eric Niebler의 기사 ( artima.com/cppsource/foreach.html )는 BOOST_FOREACH의 작동 방식을 설명합니다. 꽤 미쳤어 요.
Jeff Hardy

2
더 이상 없습니다 (11)와 람다 ... ++ C와 인기
einpoklum

34

내 즐겨 찾기는 특별한 순서는 없습니다.

  • 정규식
  • 파일 시스템
  • 어휘 캐스트
  • program_options (그냥 훌륭합니다!)
  • 테스트 (내 모든 단위 테스트 요구 사항).
  • 문자열 알고리즘
  • 문자열 토크 나이저
  • 형식 (형식이 안전한 printf 스타일 문자열 형식)
  • 스마트 ptrs

Boost는 처음으로 크로스 플랫폼 앱을 만들 때 큰 도움이되었습니다. 없이는 정말 힘들었을 것입니다.


4
제발 업데이트 C ++ / C ++ 14 11 ...
einpoklum

28

.NET 용 소멸자를 제공하는 방법이 마음에 듭니다 shared_ptr.
즉, 예를 들어 함께 사용 FILE*하여 파일을 닫을 수 있습니다.
예 :

void safeclose(FILE*fp) {
    if(fp) {
        fclose(fp);
    }
}
void some_fn() {
    boost::shared_ptr<FILE> fp( fopen(myfilename, "a+t"), safeclose );
    //body of the function, and when ever it exits the file gets closed
    fprintf( fp.get(), "a message\n" );
}

1
거의 2 년이 지난 건 알지만 ... NULL로컬 함수 매개 변수를 할당하기 때문에 그 할당은 쓸모가 없습니다. :)
Xeo

1
감사합니다 @ Xeo, 나는 그것을 제거했습니다
hamishmcn

22

아무도 멀티 인덱스 컨테이너에 대해 언급하지 않았으므로 늦게 차임 할 것입니다. 자주 필요한 것은 아니지만 부스트없이 동등한 데이터 구조를 생성하는 것은 물론 효율성이 떨어지는 것은 진정한 고통입니다. 저는 최근에 2 개의 키를 조회하는 컨테이너를 만들기 위해 많이 사용하고 있습니다.


20

아무도 언급하지 않은 것에 놀랐습니다 boost::optional. shared_ptr및을 제외한 Boost의 어떤 부분보다 더 자주 사용 하고 scoped_ptr있습니다.


1
이제 std::experimental::optional곧 (C ++ 17?) std::optional.
einpoklum 2016 년

1
그래, 나는 그것에 대해 매우 행복하다. :-) 내가 사용하는 모든 컴파일러에서 표준과 그것들의 완전한 구현 사이의 지연을 고려할지라도, 내가 그것에 의존 할 수 있기까지는 여전히 시간이 걸릴 것입니다 ... 저는 C ++ 11을 사용하기 시작할 수있었습니다. 작년 프로젝트. :-(
Head Geek

사실 저는 대부분의 컴파일러가 최근 몇 년 동안 표준을 충족하는 데 문제가 없다고 생각합니다. GCC와 clang은 출시 당시 C ++ 14를 지원 했죠? 어쨌든 귀하의 의견을 귀하의 답변에 통합하는 것을 고려하십시오.
einpoklum

@HeadGeek 8 년 후 귀하의 답변에 새 댓글이 추가 된 것을보고 흥미 롭습니다.
더칭

와우 ... 8 년 된 것 같아요 . Kermit the Frog가 말했듯이 파리를 즐길 때 시간은 즐겁습니다. ;-)
헤드 긱


11

BOOST_STATIC_ASSERT

업데이트 (2011 년 10 월) : C ++ 11 (C ++ 0x)에는 http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert 가 있습니다 static_assert .


5
BOOST_MPL_ASSERT_MSG를 사용하면 BOOST_STATIC_ASSERT가 제공하는 불완전한 유형 메시지의 크기보다 훨씬 더 많은 정보를 제공하는 오류를 매우 쉽게 읽고 발견 할 수 있습니다.
KitsuneYMG 2010 년

여기 여기! 테스트 매크로 BOOST_CHECK_CLOSE에서 이러한 불완전한 유형 오류 중 하나를 발견했습니다. (int, int, float)로 호출하기 전에 무슨 일이 일어나고 있는지 파악하는 데 반나절이 걸렸습니다. 정수를 부동 소수점으로 캐스트하면 오류가 사라졌습니다. 하지만 난 정말 :) 모르는 불완전한 유형이 무엇을 할 수
제이미 쿡

9

내가 가장 많이 사용하는 것 중 하나는 Boost에 적합하지 않지만 Boost 위에 구축 된 Adobe Source Libraries (ASL) , 특히 별도의 시작 / 끝 반복기 대신 boost :: range를 허용하는 표준 알고리즘에 대한 확장입니다. 그런 다음 전화하는 대신

std::for_each(some_container.begin(), some_container.end(), do_something());

간단히 말할 수 있습니다

adobe::for_each(some_container, do_something());

(ASL의 이러한 부분이 결국 Boost로 마이그레이션되기를 바랍니다.)


I like it, I
will

8

나는 많이 사용합니다 :

  • boost :: signals
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: bind
  • boost :: random
  • boost :: thread
  • boost :: 복사 할 수 없음

Tuple, Static Assert 및 Integer와 같은 다른 것은 다양한 플랫폼에서 사용될 라이브러리를 작성하는 경우 매우 유용합니다.

그래프 및 Lambda와 같은 것은 더 구체적입니다.


C ++ 11 / 14의 요즘 업데이트하십시오 (또는 답변 제거를 고려하십시오).
einpoklum 2016 년

8

boost::shared_ptr최신 C ++ 프로그래밍 IMHO의 요구 사항입니다. 그것이 그들이 TR1의 표준에 추가 한 이유입니다. boost::program_options,, boost::bind그리고 boost::signal그것들의 용도와 사용법을 알고 있다면 정말 좋습니다. 마지막 두 개는 신규 이민자를 두려워하는 경향이 있습니다.


7

우리는 boost :: spirit이 ECMAScript를 구문 분석하는 비즈니스 솔루션에 매우 유용하다는 것을 발견했습니다. 복잡하지만 아주 좋습니다!



7

나는 몇 년 동안 shared_ptr을 사용하고 있습니다. 너무나 유용해서 프로젝트에 그것 없이는 있어야 할 이유가 없습니다.

또한 일반적인 콜백 메커니즘 (특히 테스트 할 때 유용함)에 Bind / Function / Lambda를 사용하고 범용 sprintf 대체를위한 Format도 사용합니다.

마지막으로, 문제를 해결하기 위해 Variant를 사용하여 문제를 해결했습니다 (작고 고정되지 않은 토큰 유형 집합으로 응답 할 수있는 파서). 솔루션은 매우 우아했고 매우 만족합니다.


몇 년이 지났고 시간이 바뀌 었으므로 업데이트 할 시간입니다. SharedPtr 및 Function은 이제 표준의 일부이며 Bind 및 Lambda는 실제 언어 수준의 람다 기능에 의해 사용되지 않습니다.

나는 여전히 Variant (표준화되었지만 아직 거기에 있지 않음)를 사용하고 있으며 Format은 대체로 fmtlib (표준화 된)로 대체되었습니다.

제가 사용하는 Boost의 큰 부분은 Boost.Asio입니다. 표준화 과정에 있습니다.


1
나는 Lambda를 제외하고 위의 모든 것에 동의합니다. 한동안 사용했지만 너무 힘들어서 가장 단순한 표현을 제외한 모든 것을 포기했습니다. C ++ 0x와 그 형태의 람다 식을 간절히 기다리고 있습니다.
Head Geek

저는 Boost.Lambda가 모든 종류의 함정으로 가득 차 있다는 것에 동의합니다 .Unlambda 또는 Protect의 영역에 들어가 자마자 포기하고 예전 방식으로 수행하지만 반쯤 괜찮은 방식으로 콜백을 확장하는 데 필수적으로 보입니다. . 즉, 저도 C ++ 0x 구현을 기다리고 있습니다.
Kaz Dragon

6

다음과 같이 튜플을 사용하여 맵을 반복합니다.

string key, value;
BOOST_FOREACH(tie(key, value), my_map) { ... }

부스트 할당을 사용하여 다음과 같이 맵을 초기화 할 수 있습니다.

map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");

그리고 범위 어댑터와 pipe ( "|") 연산자를 사용하여 맵의 값을 역순으로 반복 할 수 있습니다 (예 :

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }

1
정말 멋지다. 부스트 할당에 대한 문서를 읽었습니다. boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn

5

boost :: program_options를 확인해야합니다. 명령 줄 구문 분석이 훨씬 쉬워집니다.


5

shared_ptrs 의 STL 컨테이너보다 부스트 포인터 컨테이너를 사용 합니다.



3

나는 boost :: random 및 boost :: asio 및 boost :: filesystem을 좋아하지만 boost :: bind, boost :: circular_buffer 및 boost :: thread는 매우 실용적이며 스마트 포인터는 괜찮지 만 대신 RAII를 메모리 관리로 선호합니다.


6
스마트 포인터는 RAII입니다.
Eclipse

4
보다 정확하게는 스마트 포인터는 메모리를 동적으로 할당하는 것 외에 선택의 여지가 없을 때 RAII를 제공합니다.
Branan

3

좋아, 내가 찾은 새로운 하나입니다
대신 사용하는 stricmp을 나는 부스트의 사용 등호 기능과 is_iequal 술어를 전달
예 :
대신

stricmp( "avalue", mystr.c_str() ) == 0

나는 사용할 수있다

equals( "avalue", mystr, is_iequal() ) 

주어진:

#include <boost/algorithm/string.hpp>
using namespace boost::algorithm;

3

여기 내 두 센트가 있습니다.

  • boost :: scope_exit-한 번만 사용하기 위해 RAII 클래스를 정의 할 필요가 없습니다.
  • boost :: any
  • boost :: variant
  • 부스트 포인터 컨테이너 라이브러리 (ptr_vector)
  • 부스트 풀 라이브러리
  • boost :: unorder_map / boost :: unorder_set

3

나는 boost::icl텍스트 후 처리를 위해 꽤 많이 사용 합니다. 그렇지 않으면 텍스트 분할을 직접 구현해야했기 때문에 많은 시간을 절약했습니다.

BOOST_FOREACH 내 코드의 모든 곳에 :)

boost::functionboost::bind절대해야한다. 지금 그들은 std::function있고std::bind . 이것들은 불필요한 코드의 양을 줄이는 데 도움이되며 일반적으로 내 디자인 (또는 내 망상)에 좋습니다.

나는 최근에 사용하기 시작했습니다 boost::interprocess::message_queue 했고 이것은 또한 훌륭한 도구입니다.

더 많이 사용하지만 Qt는 Boost가하는 일을 많이하는 네이티브 방식을 가지고 있습니다. 순수 C ++를 프로그래밍해야한다면 내가 될 것 같아요 boost::junkie:)


3

내가 가장 많이 사용하는 것은 이제 TR1에서 사용할 수 있습니다.

  • 공유 포인터
  • 배열 클래스

이제 저는 풀 클래스와 다른 좀 더 구체적인 것들을 사용합니다.

이제 Boost가 대부분의 프로그래머에게 유용하다는 것을 이해했습니다. 이것이 바로 미래의 표준 라이브러리를위한 테스트 베드 인 이유입니다.


1

boost :: lexical_cast에 대해 이야기하면서 std :: string 라이브러리에서 'format'과 같은 것이 정적 멤버가 아닌 이유는 무엇입니까?
거의 모든 GUI 라이브러리에는 초기화 된 문자열을 반환하는 CString :: Format ( "% i") 또는 QString :: Number ( "% i")와 같은 것이 있습니다.


4
예 : std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Rob

형식 안전성을 포기하고 싶다면 vsnprintf (), ellipsis (...), va_list / stdarg.h 및 로컬 (스택 기반) 버퍼를 사용하여 직접 롤링 할 수 있습니다.
Mr. Ree

2
std :: string에는 이미 71 개의 함수가 너무 많습니다 (내가 아닌 Herb Sutter의 수에 의해). 자세한 내용은 gotw.ca/gotw/084.htm 을 참조하십시오. (a) 형식이 std :: string에 있어야 할 필요가없는 이유와 (b) 클래스 멤버보다 일반 알고리즘을 작성하는 것이 더 좋은 이유를 설명하기에 충분한 정보가 있다고 생각합니다. 어쨌든 기능.
Steve Jessop

4
또는 다른 말로 말하자면, "C ++는 외국과 같습니다. 그들은 그곳에서 일을 다르게합니다";-)
Steve Jessop

1
Stroustrup이 C ++를 설계 할 때 제기 한 과제 중 하나는 형식이 안전한 형식의 I / O 라이브러리를 만드는 것이기 때문에 Format은 라이브러리의 일부가 아닙니다. 분명히 결과는 iostreams에서 보는 것입니다. 분명히 그 당시에는 아무도 보간법을 생각하지 않았습니다. 아마도 누군가는 전통 주의자들이 집에있는 것처럼 느끼도록 포맷 스트림을 작성하고 싶습니까?
Phil Miller

1

나는 질문을 뒤집어 야한다고 생각한다. 어느 부분 을 사용 하고 싶지 않습니까?

내 경험상 거의 모든 것이 각 문제 영역에서 흥미롭고 유용합니다.

관심사를 다루는 영역을 찾기 위해 부스트 문서를 둘러 보는 데 시간을 투자해야합니다.

한 가지 예외는 boost::numeric::ublas작업을 수행하는 것일 수 있지만 Eigen 은 훨씬 더 잘 수행합니다.


많은 사람들이 옥 토니 언 라이브러리를 사용하고 있는지 의심합니다.
Petter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.