2013-07-25 3 views
12

나는이 예제 프로그램이 있습니다패스 템플릿 인수 및 또는 &&

  • 메시지가 전달됩니다 : 당신은 내가 인수를 전달하는 다른 방법을 사용하여 볼 수 있듯이

    #include <iostream> 
    
    template<typename Message, typename Decoration, typename PrintImpl> 
    void print_surrounded(Message&& msg, const Decoration& decoration, const PrintImpl& print_impl) 
    { 
        print_impl(decoration); // should forward be used? 
        print_impl(" "); 
        print_impl(std::forward<Message>(msg)); 
        print_impl(" "); 
        print_impl(decoration); 
    } 
    
    template<typename Message, typename PrintImpl> 
    void pretty_print(Message&& msg, const PrintImpl& print_impl) 
    { 
        print_surrounded(std::forward<Message>(msg), "***", print_impl); 
    } 
    
    int main() 
    { 
        pretty_print("So pretty!", [](const char* msg) { 
         std::cout << msg; 
        }); 
    } 
    

    I also posted it on Coliru.

    결국 PrintImpl 함수로 전달되어야하므로 범용 참조로 사용됩니다.

  • 데코레이션은 값이 두 번 사용되기 때문에 const ref로 전달됩니다. 앞으로 두 번 사용하면 안전할지 모르겠습니다. (첫 번째 전달에 의해 사라질 수 있습니다.)
  • 앞으로 사용할 이유가 없기 때문에 PrintImpl이 const 참조로 전달됩니다. 그러나 이것이 현명한 지 확실하지 않습니다.

내가 올바른 선택을하고 있는가 (예, 나는 또한 std::forward를 사용해야하는 경우 나? && 통과해야)?

+0

이것은 CPS가 의미하는 바를 정확히 이해하지 못했습니다. http://en.wikipedia.org/wiki/Continuation-passing_style 또한 주석의 줄에서'decoration'가 아니라'print_impl'과 함께'forward'를 사용할 것인지 묻는다고 가정합니다. 맞습니까? – sehe

+0

@sehe 좋아, CPS 부품을 제거했습니다. – StackedCrooked

+0

그냥 명확히하기 위해 : 여기에 정확한 용어를 "포착"합니까? 클로저 객체 (람다 표현식에 의해 생성 됨)에 의한 변수 캡처를 위해 "캡쳐"가 예약되어 있다고 생각했습니다. 논증의 "통과"가 올바른 용어가 아닌가? – Walter

답변

4

오전 나는 올바른 선택을?

예 (주로).

데코레이션은 값이 두 번 사용되기 때문에 여기에서 const ref로 캡처되며 앞으로 두 번 사용하면 안전할지 모르겠습니다. (최초의 전진에 의해 멀리 이동 될 수 있는가?) 당신이 그것을 여러 번 할 줄 때

정확히 당신이 밖으로 누워 이유로, std::forward를 사용하지 마십시오.

PrintImpl은 앞으로 사용할 이유가 없기 때문에 const 참조로 캡처됩니다.

네가 뭘 원하는 것일 수도 함수 객체가 const없이 전달 될 operator()을 restrict로 수 PrintImpl&&을 가지고 std::forward (lvalues로 유지)를 사용하지 않는 것입니다.

+1

만약 당신이 매우 어리 석다면 함수의'print_impl'에 대한 마지막 호출에서'PrintImpl'가'&&'qualified 연산자를 가질 경우에'std :: forward (print_impl)()'할 수 있습니다()'. (주 : 아무도'&&'한정 연산자'()'를 가지고 있지 않다) – Yakk