일부 배경 : auto_ptr과 같은 파괴적인 복사 의미 체계를 가질 수있는 정책 기반 스마트 포인터 (예 : Loki 라이브러리의 SmartPtr)를 작성하고 있습니다. 따라서 복사되는 객체를 수정하기 위해 비 const 참조를 사용하는 템플릿 복사 생성자가 필요합니다.복사 생성자 내의 "템플릿 typedef"가 작동하지 않습니다.
내가하려는 것은 파괴적인 복사 의미론이 바람직하지 않을 때 const로 만들기 위해 정책에서 일부 변수에 의해 복사 생성자가 취한 인수의 constness를 매개 변수화하는 것입니다. 컴파일러가 템플릿 인수를 추론 할 수 없기 때문에 여기에 나와있는 아이디어의 단순화 된 코드가 있지만, 불행히도 작동하지 않습니다. 원하는 동작을 달성하는 데 사용할 수있는 다른 기술이 있습니까?
template <typename T, bool isEnabled> struct AddConst {
typedef T Type;
};
template <typename T> struct AddConst<T, true> {
typedef const T Type;
};
struct MyCopyPolicy {
static const bool kIsCopyArgConst = true;
};
template <typename T, class CopyPolicy> struct Foo {
// A helper struct to achieve "template typedef".
template <typename T2> struct CopyArg {
typedef typename AddConst<Foo<T2, CopyPolicy>,
CopyPolicy::kIsCopyArgConst>::Type Type;
};
Foo() {}
// Template copy constructor. Doesn't work.
template <typename T2> Foo(typename CopyArg<T2>::Type& rhs) {}
};
int main() {
Foo<int, MyCopyPolicy> foo1;
Foo<double, MyCopyPolicy> foo2 = foo1; // error!
}
<추론하지 않은 컨텍스트 "와 관련하여와 비슷한 문제가 있습니다. . catch는 ** 모든 ** 가능한 유형에 대해 CopyArg를 인스턴스화하지 않고 컴파일러가 T2를 판별 할 수없고 중첩 된 유형을 비교할 수 없다는 점입니다. –