2012-02-09 4 views
17

종종 Boost 강력한 typedef 유틸리티를 사용하여 내 프로그램의 안전성을 향상시킵니다. 예를 들어 다음과 같은 코드를 작성하는 경우 :강력한 typedef를 Boost Parameter 라이브러리보다 가벼운 대안으로 사용 하시겠습니까?

BOOST_STRONG_TYPEDEF(int, X) 
BOOST_STRONG_TYPEDEF(int, Y) 
BOOST_STRONG_TYPEDEF(int, Width) 
BOOST_STRONG_TYPEDEF(int, Height) 

struct Rect { 
    Rect(X x, Y y, Width w, Height h); 
}; 

// Usage: 
Rect rect(X(10), Y(20), Width(800), Height(600)); 

강력한 typedef는 코드 가독성과 안전성을 향상시킵니다. (인수는 인수가 모든 int 인 경우에 경우 없었을 것입니다 잘못된 순서에 제공하는 경우 컴파일러에서 오류를보고합니다.)

내 질문은 :

  • 가 그것을 확인인가 이를 위해 BOOST_STRONG_TYPEDEF를 사용 하시겠습니까? (문서는 very brief입니다.)
  • 이 대신 부스트 매개 변수 라이브러리를 선호하는 중요한 이유가 있습니까?
+1

당신이 'OK'는 무엇을 의미하는 따라, 그것은 컴파일 및 실행은 그 잘못 그래서 무엇을 가정합니다. 나는이 논리 뒤에 당신의 논리를 보지만, 나에게 '틀린'것처럼 보입니다. 거기에 varaibles와 paramaters의 이름을 붙일 수있는 이유가 있습니다. 따라서,'width' 매개 변수를 설정하기 위해'width'에'int'를 명시 적으로 캐스팅하는 것은 잘못된 것처럼 보입니다. 'int'만으로'set (width w);'등을 사용하는 것이 편리 할 지 모르지만 그렇게 할 수는 없습니다. – thecoshman

+1

boost 매개 변수는 명명 된 (그리고 선택 사항 인) 인수를위한 것이고 BOOST_STRONG_TYPEDEF *는 원래 유형을 대체 할 수 있지만 여전히 고유 한 유형 *을 사용할 수있는 새로운 유형 "이름"을 만듭니다. – Gigi

답변

18

기술적으로 말하면 :

난 그냥 하나의 함수의를 위해 새로운 유형을 만들어 권하고 싶지 않다 :

  • 그것은 작동이 실질적으로

말하기 안전을 입력 추가

  • 매개 변수 (이 함수에 고유 한 열거 형이 아닌 경우)는 유형을 계속해서 사용하여 캐스트가 반복적으로 사용되는 것을 방지해야합니다.

    유형 X, Y, WidthHeight 응용 프로그램 전체에서 사용하는 경우에는 캐스트가 없을 것입니다,하지만 응용 프로그램이 훨씬 더 안전하고 더 나은 너무 문서화 된 것뿐만 아니라 (그래 ... 나는 타입입니다 변덕).

    이제 Boost.Parameters과 관련하여,이 완전히 다르다. 당신이 이미 유형이있을 때

    Boost.Parameters은 (잠재적으로) 추가 할 수 있습니다. 솔직히 나는 결코 그 필요성을 보지 못했다. Boost.Parameters가 호출 할 때 함수가 너무 커지면 함수를 수정해야합니다.

    +2

    +1 형식으로 만세! – pyon

    +0

    나는 명명 된 매개 변수가 사용자를 "혼란"으로 여겨야하는 사용자를 결정할 수없는 매우 일반적인 라이브러리에 특히 적합하다고 생각하며 과부하를 과부하 상태로 만듭니다. 압도적 인 반 패턴 – sehe

    +0

    내 마음 속의 boost.parmater에 대한 유즈 케이스는 – odinthenerd

    2

    BOOST_STRONG_TYPDEF를 사용하면 새로운 유형이 생성됩니다. 여기서 부스트 매개 변수 라이브러리는 매개 변수에 이름을 지정하는 데 사용됩니다. 그것은 당신이 당신의 기능이 무엇을 더 노골적으로하실 수 있습니다. 예를 들어 (부스트 문서에서)

    #include <boost/parameter/preprocessor.hpp> 
    
    namespace graphs 
    { 
        BOOST_PARAMETER_FUNCTION(
         (void),    // 1. parenthesized return type 
         depth_first_search, // 2. name of the function template 
    
         tag,     // 3. namespace of tag types 
    
         (required (graph, *)) // 4. one required parameter, and 
    
         (optional    // four optional parameters, with defaults 
         (visitor,   *, boost::dfs_visitor<>()) 
         (root_vertex,  *, *vertices(graph).first) 
         (index_map,   *, get(boost::vertex_index,graph)) 
         (in_out(color_map), *, 
          default_color_map(num_vertices(graph), index_map)) 
        ) 
    ) 
        { 
         // ... body of function goes here... 
         // use graph, visitor, index_map, and color_map 
        } 
    } 
    

    명시 적으로 계약 방식의 디자인으로 예상되는 내용을 명시 할 수 있습니다. 그러나이 작업을 수행 할 가치가 없도록 코드의 가독성을 복잡하게합니다. 이 (부스트 문서에서 다시) "기능 또는 템플릿 중 하나를 매개 변수와 일치에 사용할 수있는"새로운 유형을 만들어으로

    는 개인적으로 나는 BOOST_STRONG_TYPEDEF를 사용하는 것을 선호합니다.

    관련 문제