내 프로젝트에서 사용하지 않으려는 클래스 템플릿이 있습니다.클래스 이름을 유지하면서 클래스 템플릿을 폐기하는 올바른 절차는 무엇입니까?
template<typename T, size_t Size>
class X {};
나는 다음과 같은 계획을 세웠다. 다음 버전의 경우 1 단계
-의 버전이 "5"가정 해 봅시다 - I가 사용되지 않는 별칭으로 이전을 다른 이름 (교체)에 "새로운"클래스를 제공하고 변환하는거야 :
를template<size_t ElementSize, size_t Size>
class X2 {};
template<typename T, size_t Size>
using X __attribute__ ((deprecated)) = X2<sizeof(T), Size>;
이렇게하면 "이전"API의 모든 사용자에 대해 경고가 표시되지만 코드는 계속 작동합니다. 다음 버전에서는 2 단계
는 - "6"- 나는 사용되지 않는 별칭을, "오래된"사용되지 않는 클래스를 제거 이전 이름 한 "새로운"을 이름을 변경하고 만들려고 :
template<size_t ElementSize, size_t Size>
class X {};
template<size_t ElementSize, size_t Size>
using X2 __attribute__ ((deprecated)) = X<ElementSize, Size>;
다시 경고 메시지가 표시됩니다.
마지막 단계에서 3 단계
- 버전 "7"에서 수행 - 난 단지 변경된 클래스를 떠나, 사용되지 않는 별칭을 제거 할 수 있습니다.
template<size_t ElementSize, size_t Size>
class X {};
이 모든 방식 (사용자가 두 번 자신의 코드를 변경해야합니다)과 단점 (단지 경고가 사용되지 않는 인터페이스에 대한 발행, 코드 컴파일 및 작동 각 단계에서) 몇 가지 장점이있다. 그러나 나는 더 좋은 점을 생각해 내지 못했다. 필자가 고려한 다른 모든 옵션은 컴파일 오류를 포함한다. 여기에서 직면하는 주된 문제는 클래스의 이름을 유지하면서 (최종 단계에서) 클래스 "signature"를 <type, value>
에서 <value, value>
으로 변경한다는 것입니다.이 가정은 다른 모든 영리한 옵션을 배제합니다. ...
더 좋은 옵션이 있습니까? 그렇지 않다면, 위의 계획이 "받아 들일 수있는"것처럼 보일 수 있습니까, 아니면 단지 하나의 컴파일 실패를 일으켜야하고 그 일을 끝내야합니까? 이 프로젝트는 초기 단계에 있으므로 하위 호환성에 대해서는별로 신경 쓰지 않지만 전체 프로세스를 시험해 볼 수있는 좋은 기회라고 생각했습니다.
에
#define USE_NEW_API
로 전환#if !(defined(USE_OLD_API) || defined(USE_NEW_API)) #define USE_OLD_API
이 (참 또는 클래스를!). 이것은 "이전 버전과 호환되지 않는 변경 사항을 어떻게 소개합니까?"라는 일반적인 전역 문제입니다. –일반적으로 여러 릴리스에 대한 점진적인 지원 중단 및 제거가 좋은 방법입니다.제품의 [semantic versioning] (http://semver.org/)과 같은 것을 사용하면 더 쉬울 수도 있습니다. 또한, * 설명서 문서화 문서 *는 매우 중요합니다. –
@OliverCharlesworth - 함수 감가 상각의 경우 문제가 더 쉽습니다. 왜냐하면 과부하를 도입하고이를 수행하기 때문입니다.하지만 여기에서는 "템플릿 오버로드"를 사용할 수 없습니다. 서명... –