2012-08-06 7 views
4

나는 내가하고 싶은 것은 나는이처럼 쓸 수있는 곳 스트림 클래스 Debug 쓰기 지금이단락`연산자 <<`C++의 출력

if(debug) { 
    Output << "f1: " << f1() << "\n"; 
} 

같은 구조를 뿌리고 일부 코드가

Debug << "f1: " << f1() << "\n"; 

일부 전역 플래그가 설정된 경우 출력이 생성되고, 그렇지 않은 경우 출력이 생성됩니다.

Now : 이것은 Debug이 출력을 삼키는 /dev/null으로가는 스트림을 반환함으로써 매우 쉽게 수행 할 수 있습니다. 문제는 f1()이 여전히 성능에 나쁜 영향을 미칠 수도있는 (심지어 더 비쌀 수도있는 텍스트 표현으로 '렌더링'됨) 여전히 평가된다는 것입니다.

이제 내 질문 : 어떤 출력이 수행되지 않는다는 것을 Debug가 결정하면 완전히

"f1: " << f1() << "\n" 

의 '평가'의 건너 뛰기를 할 수있는 트릭이있다? g()f()false 경우 평가되지 않습니다 C++가 f() && g()의 경우와 단락 유사

(I 심각 출력 연산자로하지만 난 단락을 읽은 내용에서 &&를 사용하는 스트림 클래스를 작성하는 생각이 operator&& 오버로드에 대해 수행되지 않음) 매크로에 악영향을하지 않은 및 구문을 받아 들일 경우
+0

[이 관련 질문] (http://stackoverflow.com/questions/11826554/standard-no-op-output-stream) 오늘부터 해결책을 찾을 수 있습니다. – juanchopanza

+0

@ juanchopanza : 그 질문은 여전히 ​​(아마도) 논증을 평가합니다. 나는 당신이'DEBUGOUT ("f1 :"<< f1() << "\ n");' –

+0

@MooingDuck true와 같은 형식으로 바꾸지 않는 한 질문에 따라 이것을 할 수 있다고 생각하지 않는다. 그들은 단지 스트리밍을 피합니다. – juanchopanza

답변

5

이 매크로를 정의하다 가독성)

if(!debug); 
else 
    Output << "f1: " << f1() << "\n"; 
+2

이것은 다른 불일치가 끼어 들기 쉽습니다. –

+1

@MarkB :'if (! debug); else Output'을 정의하여 수정할 수 있습니다. – ybungalobill

+0

좋은 캐치 마크. 그리고 제안에 대해 @ybungalobill에게 감사드립니다. 해결할 답변을 변경했습니다. –

4

:

Debug("f1: " << f() << '\n'); 

꽤 간단합니다

#define Debug(x) debug != NULL && *debug << x; 
: 단지 같은 것을 정의

그러나 대개 괄호 안에 인수를 넣을 때주의 할 수 없으므로 다소 위험합니다. (반면에 난 많은 응용 프로그램에서 문제없이 사용되는 것을 보았습니다.) 매크로 접근 방식을 사용하면 원하는 경우 __FILE____LINE__을 자동으로 삽입 할 수 있습니다. 또는 매크로를 조건부로 의 모든을 표시하지 않으려면 매크로를 아무것도 지정하지 마십시오. 말 그대로

if(debug) { 
    Output << "f1: " << f1() << "\n"; 
} 

하지만를 (플러스 공백 :

Debug_Stream << "f1: " << f1() << "\n"; 

이 동등하게 :

#define Debug_Stream \ 
if(!debug); else Output 

이이를 만들 것입니다 : 당신이 할 수있는 일

2

값 비싼 함수 호출을 감싸는 지연 평가기를 생성하여이 작업을 수행 할 수 있다고 생각합니다. 스트림은 참조 된 함수를 호출하는 데 필요한 지연된 평가자 유형을 알고 있지만 그렇지 않으면 값 비싼 호출을 방지하지 못합니다.no-debug 스트림은 프록시 평가 기 객체가 평가를 완전히 건너 뛸 수 있음을 알고 있습니다.

Debug << "123" << delay(f()) << "456" << std::endl; 

이 디버그 라인의 지연을 호출하기 위해 기억 포함 않습니다

예를 들어 전화처럼 보일 수 있습니다. 귀하의 경우 중요한 문제 일 수도 있고 아닐 수도있는 매크로가 필요하지 않습니다.