템플릿 인수 집합이 주어지면 클래스를 재귀 적으로 빌드하는 방법을 찾아서 클래스가 자체에서 상속하고 f
템플릿 인수 목록에서 현재 첫 번째 템플릿 인수에 대한 메서드 를 빌드 한 다음 나머지를 전달하여 자체적으로 상속하도록해야합니다. 목록의.
그래서 기본적으로 클래스에 대해 다음 인터페이스를 얻고 싶습니다 C
.
C<T1, T2, T3> c;
c
이제 방법을 가지고 C::f(T1)
, C::f(T2)
그리고C::f(T3)
지금까지의 접근 방식은 다음과 같습니다.
// primary template
template <class H, class...>
class C {};
// base case where class... is empty
template <class H, class...>
class C<H>
{
public:
void f(const H& h){
// std::cout << typeid(h).name() << "\n";
}
};
// recursive case where T is nonempty
template <class H, class... T>
class C : public C<T...>
{
public:
void f(const H& h){
// std::cout << typeid(h).name() << "\n";
}
};
이것은 실제로 컴파일되지 않습니다.
오류 : 'C'클래스 C 재정의 : 공용 C
내 접근 방식이 기본적으로 가능하고 의미 상 또는 구문 상 유효하지 않은 코드의 문제입니까, 아니면이 접근 방식이 원칙적으로 작동하지 않습니까?
우선, 클래스는 자신으로부터 상속받을 수 없습니다.
둘째, 분명히 달성하려는 모든 것은 각 템플릿 매개 변수가 해당 클래스를 매개 변수로 사용하는 클래스 메서드를 생성하도록하는 것입니다.
어떤 경우에는 이와 같은 것이 작동합니다.
template<typename ...> class C;
template<>
class C<> {};
template<typename T, typename ...Args>
class C<T, Args...> : public C<Args...> {
public:
void f (const T &)
{
// Whatever...
}
};
이것은 자신을 상속하는 클래스가 아닙니다. 다른 템플릿 인스턴스에서 상속되는 템플릿 인스턴스입니다. 각 템플릿 인스턴스는 고유 한 클래스입니다.
여기서 문제가되는 클래스 메서드에 대한 정의는 두 개가 아닌 단일 정의가 있습니다. 이것은 약간의 개선입니다.
또 다른 개선 사항은 다른 클래스 요구 사항을 고려하여이 작업을 수행 할 수있는 경우 이러한 방식으로 클래스 계층 구조를 재배 열하는 것입니다.
template<typename T> class F {
public:
void f (const T &)
{
}
};
template<typename ...> class C;
template<>
class C<> {};
template<typename T, typename ...Args>
class C<T, Args...> : public C<Args...> , public F<T> {
};
이 방법을 사용하면 C<int, float>
, 또는 을 사용하든 C<int, char *>
항상 클래스 메서드가의 메서드로 선언됩니다 F<int>
. 예를 들어 C
를 포함하는 모든 인스턴스는 and와 int
같은 두 개의 개별 메서드 대신 단일 클래스 메서드 인스턴스를 생성 하므로 결과 코드 float가 약간 줄어 듭니다. 그렇지 않으면 완전히 동일합니다.C<int, float>::f(const int &)
C<int, char *>::f(const int &)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다