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 |