Program Language/C & C++

[C++] namespace를 이용한 version 관리

야곰야곰+책벌레 2022. 1. 14. 09:23
728x90
반응형

많은 종류의 인터페이스에 대한 가장 어려운 테스트는 일연의 새 릴리즈(버전)에 대처하는 것이다. ISO C++ 표준 헤더와 같이 널리 사용되는 인터페이스를 고려해 보자. 사용자가 정확히 하나의 특정 버전을 볼 수 있도록 간단하고 명확하게 두 버전 중에서 선택하는 방법이 있다. 이것을 인라인 네임스페이스라고 한다.

namespace Popular {
	inline namespace V3_2 { // V3_2 provides the default meaning of Popular
		double f(double);
		int f(int);
		template<class T>
		class C { /* ... */ };
	}
    
	namespace V3_0 {
		// ...
	}

	namespace V2_4_2 {
		double f(double);
		template<class T>
		class C { /* ... */ };
	}
}

여기에서 Popular는 각각 버전을 정의하는 세 개의 하위 네임스페이스를 포함한다. 인라인은 V3_2가 Popular의 기본 의미임을 지정한다. 따라서 다음과 같이 작성할 수 있다.

using namespace Popular;
void f()
{
	f(1); // Popular ::V3_2::f(int)
	V3_0::f(1); // Popular ::V3_0::f(double)
	V2_4_2::f(1); // Popular ::V2_4_2::f(double)
}
template<class T>
Popular::C<T∗> { /* ... */ };

이 인라인 네임스페이스 솔루션은 방해가 된다. 즉, 기본 버전(하위 이름 공간)을 변경하려면 헤더 소스 코드를 수정해야 한다. 또한 이러한 버전 관리 방식을 순진하게 사용하면 많은 복제(다른 버전의 공통 코드)가 필요하다. 그러나 #include 트릭을 사용하여 복제를 최소화할 수 있다.

// file V3_common:
	// ... lots of declarations ...
// file V3_2:
	namespace V3_2 { // V3_2 provides the default meaning of Popular
		double f(double);
		int f(int);
		template<class T>
		class C { /* ... */ };
		#include "V3_common"
	}
// file V3_0.h:
	namespace V3_0 {
		#include "V3_common"
	}

// file Popular.h:
	namespace Popular {
		inline
		#include "V3_2.h"
		#include "V3_0.h"
		#include "V2_4_2.h"
	}

정말 필요한 경우가 아니면 헤더 파일을 그렇게 복잡하게 사용하지 않는 것이 좋다. 위의 예는 비로컬 범위에 포함하는 것과 구문 구성이 파일 경계에 걸쳐 있는 것 (인라인 사용)에 대한 규칙을 반복적으로 위반한다.

대부분의 경우 덜 방해가 되는 방법으로 버전 관리를 수행할 수 있다. 생각할 수 있는 유일한 예는 네임스페이스 이름을 명시적으로 사용하여 템플릿을 특수화하는 것이다(예:Popular::C <T*>). 그러나 많은 중요한 경우 '대부분의 경우'만으로 충분하지 않다. 다른 기술의 조합을 기반으로 하는 솔루션이 완전히 정확하지는 않다.

728x90
반응형

'Program Language > C & C++' 카테고리의 다른 글

[C++] 클래스 가변성(mutability)  (0) 2022.01.14
[C++] 클래스 explicit 생성자  (0) 2022.01.14
[C++] Catching Exception  (0) 2022.01.13
[C++] throwing exception  (0) 2022.01.13
[C++] Finally  (0) 2022.01.13