내가 몇 가지 옵션을 제공합니다. 모두 장단점이있다.
VisualizerObject
을 수정할 수 없다면 주석에서 언급했듯이 전 처리기가 범위를 고려하지 않고 전처리기를 사용하여 효과를 얻을 수 있으며 질문은 구체적으로 개체의 수명을 제어하는 방식으로 시도합니다 범위 경계를 넘는
#ifdef VISUALIZE_OUTPUT
VisualizerObject vis_object;
#endif
#ifdef VISUALIZE_OUTPUT
vis_object.initscene(objects_here);
#endif
컴파일러는 #ifdef
/#endif
에없는 그 vis_object
의 사용을 진단하는 것입니다.
물론 큰 비판은 전처리 기의 사용이 C++에서 좋지 않은 것으로 간주된다는 것입니다. 이점은 VisualizerObject
클래스를 수정할 수없는 경우에도 (예 : 제공되는 소스 코드가없는 제 3 자 라이브러리에 있기 때문에) 접근법을 사용할 수 있다는 것입니다.
그러나 이것은 개체 수명 교차 범위 범위의 OP에서 요청한 기능을 가진 유일한 옵션입니다. 그것은 VisualizerObject
클래스를 수정 할 수 있다면
는 두 개의 전문
template<bool visualise> struct VisualizerObject
{
// implement all member functions required to do nothing and have no members
VisualizerObject() {};
void initscene(types_here) {};
};
template<> struct VisualizerObject<true> // heavyweight implementation with lots of members
{
VisualizerObject(): heavy1(), heavy2() {};
void initscene(types_here) { expensive_operations_here();};
HeavyWeight1 heavy1;
HeavyWeight2 heavy2;
};
int main()
{
VisualizerObject<VISUALIZE_OUTPUT> vis_object;
...
vis_object.initscene(objects_here);
...
vis_object.drawScene(objects_here);
}
(가) 위의 모든 C++ 버전에서 작동과 템플릿합니다. 본질적으로, 아무것도하지 않는 멤버 함수를 사용하여 가벼운 객체를 인스턴스화하거나 중량 버전을 인스턴스화하여 작동합니다.
VisualizerObject
을 감싸는 위의 방법을 사용할 수도 있습니다.
template<bool visualise> VisualizerWrapper
{
// implement all required member functions to do nothing
// don't supply any members either
}
template<> VisualizerWrapper<true>
{
VisualizerWrapper() : object() {};
// implement all member functions as forwarders
void initscene(types_here) { object.initscene(types_here);};
VisualizerObject object;
}
int main()
{
VisualizerWrapper<VISUALIZE_OUTPUT> vis_object;
...
vis_object.initscene(objects_here);
...
vis_object.drawScene(objects_here);
}
템플리트 접근법 모두의 단점은 유지 - 다른 동일한 서명 기능을 추가 할 필요가 하나 개의 클래스 (템플릿 전문)을 멤버 함수를 추가 할 때. 대규모 팀 설정에서는 테스트/빌드가 대부분 VISUALIZE_OUTPUT
또는 다른 설정으로 이루어 지므로 한 버전을 다른 인터페이스 (다른 인터페이스)에서 쉽게 가져올 수 있습니다. 이러한 문제 (예 : 설정 변경시 실패한 빌드)는 다른 버전의 제품을 제공하기위한 마감일이 부적절한 경우와 같이 불편한시기에 나타날 수 있습니다.
Pedantically, 템플릿 옵션의 다른 단점은
if(VISUALIZE_OUTPUT)
{
vis_object.initscene(objects_here);
}
에 필요하지 않은 if
즉, 원하는 "패턴의 종류"준수 및 범위의 경계를 교차하지 않는 수명을 반대하지 않는다는 것입니다 .
** 가장 바깥 쪽 범위에 있어야하는 'VisualizerObject vis_object;'를 사용하면 성능 문제가 ** 측정 되었습니까? – Caleth
나는 당신이 바라는 "종류의 패턴"에 결함이 있다고 생각합니다. 기본적으로 범위를 존중하지 않는 방식으로 조건 적으로 일을 수행하는 방법을 모색하고 있습니다. 따라서 실행 가능한 옵션은'VISUALIZE_OUTPUT'을 전 처리기 매크로로 만들고,'#ifdef VISUALISE_OUTPUT' /'#endif'에서'vis_object'의 정의와 사용법을 모두 감싸는 것입니다. 선처리가 범위를 존중하지 않기 때문에이 기능이 작동합니다. 그러나 전처리 기 술을 사용하는 것은 C++에서 매우 좋은 이유로 인해 권장되지 않습니다. – Peter