템플릿 인수 집합에 대한 메서드 오버로드를위한 재귀 상속

그것은 tolmencre

템플릿 인수 집합이 주어지면 클래스를 재귀 적으로 빌드하는 방법을 찾아서 클래스가 자체에서 상속하고 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

내 접근 방식이 기본적으로 가능하고 의미 상 또는 구문 상 유효하지 않은 코드의 문제입니까, 아니면이 접근 방식이 원칙적으로 작동하지 않습니까?

Sam Varshavchik

우선, 클래스는 자신으로부터 상속받을 수 없습니다.

둘째, 분명히 달성하려는 모든 것은 각 템플릿 매개 변수가 해당 클래스를 매개 변수로 사용하는 클래스 메서드를 생성하도록하는 것입니다.

어떤 경우에는 이와 같은 것이 작동합니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

상속 된 메서드에 대한 템플릿 함수 포인터와 함께 사용되는 템플릿 메서드 문제

분류에서Dev

C ++에서 오버로드 된 곱셈 연산자에 대한 재귀 클래스 템플릿 인스턴스화 중 오류

분류에서Dev

상속 된 템플릿 메서드에 대한 모호한 호출

분류에서Dev

상속이있는 오버로드 된 멤버 함수에 대한 포인터의 형식이 아닌 템플릿 매개 변수

분류에서Dev

오버로드 된 함수에 대한 템플릿 인수를 추론 할 수 없습니다.

분류에서Dev

템플릿 메타 프로그래밍에 대한 꼬리 재귀 성능

분류에서Dev

C ++ 템플릿 및 오버로드 된 함수에 대한 모호한 호출

분류에서Dev

내 템플릿에서 재귀 함수가 한 번만 인쇄되는 이유는 무엇입니까?

분류에서Dev

N 차원 벡터에 대한 재귀 가변 템플릿 함수

분류에서Dev

템플릿 인수 수에 따라 템플릿 "오버로드"

분류에서Dev

템플릿을로드하기위한 재귀 호출을 사용하여 ajax 데이터를 ng-include에 바인딩

분류에서Dev

변수 템플릿을 사용한 재귀 계산-gcc 대 clang

분류에서Dev

템플릿 인수를 기반으로 한 함수 오버로드 세트로 가변 템플릿 클래스를 구축합니까?

분류에서Dev

C ++ : 가능한 다양한 생성자 인수를 사용하여 템플릿 클래스에서 상속

분류에서Dev

개인 메서드에 대한 재귀 개체 액세스

분류에서Dev

클래스 템플릿 메서드에 대한 void 포인터의 벡터

분류에서Dev

가변 템플릿 함수에서 오버로드 된 함수에 대한 모호한 호출

분류에서Dev

Twig를 사용하여 상위 템플릿에서 하위 템플릿의 변수 집합에 액세스

분류에서Dev

템플릿 인수에 대한 템플릿 템플릿 전문화

분류에서Dev

함수 템플릿의 선언 부분에 정의 된 경우 임의 형식 속성에 대한 함수 오버로드가 실패합니다.

분류에서Dev

스칼라 템플릿 코드 블록 및 값을 템플릿 호출에 대한 인수로 사용 (Play Framework)

분류에서Dev

템플릿 템플릿 매개 변수에 대한 추론 가이드

분류에서Dev

템플릿 클래스의 템플릿 메서드에 대한 Clang AST

분류에서Dev

django 템플릿 상속-여러 하위 템플릿에 대한 views.py

분류에서Dev

템플릿 종속 매개 변수에 대한 클래스 템플릿 인수 추론

분류에서Dev

재귀 적으로 상속 된 템플릿 기본 클래스의 템플릿 메서드를 호출하는 방법

분류에서Dev

템플릿을 사용하여 함수 메서드가 존재하는지 재귀 적으로 확인

분류에서Dev

템플릿 메소드 매개 변수의 기본값에 대한 루비 상수?

분류에서Dev

upheap 메서드에 대한 재귀 함수 (이 비 재귀 메서드를 재귀에 어떻게 쓸 수 있습니까?)

Related 관련 기사

  1. 1

    상속 된 메서드에 대한 템플릿 함수 포인터와 함께 사용되는 템플릿 메서드 문제

  2. 2

    C ++에서 오버로드 된 곱셈 연산자에 대한 재귀 클래스 템플릿 인스턴스화 중 오류

  3. 3

    상속 된 템플릿 메서드에 대한 모호한 호출

  4. 4

    상속이있는 오버로드 된 멤버 함수에 대한 포인터의 형식이 아닌 템플릿 매개 변수

  5. 5

    오버로드 된 함수에 대한 템플릿 인수를 추론 할 수 없습니다.

  6. 6

    템플릿 메타 프로그래밍에 대한 꼬리 재귀 성능

  7. 7

    C ++ 템플릿 및 오버로드 된 함수에 대한 모호한 호출

  8. 8

    내 템플릿에서 재귀 함수가 한 번만 인쇄되는 이유는 무엇입니까?

  9. 9

    N 차원 벡터에 대한 재귀 가변 템플릿 함수

  10. 10

    템플릿 인수 수에 따라 템플릿 "오버로드"

  11. 11

    템플릿을로드하기위한 재귀 호출을 사용하여 ajax 데이터를 ng-include에 바인딩

  12. 12

    변수 템플릿을 사용한 재귀 계산-gcc 대 clang

  13. 13

    템플릿 인수를 기반으로 한 함수 오버로드 세트로 가변 템플릿 클래스를 구축합니까?

  14. 14

    C ++ : 가능한 다양한 생성자 인수를 사용하여 템플릿 클래스에서 상속

  15. 15

    개인 메서드에 대한 재귀 개체 액세스

  16. 16

    클래스 템플릿 메서드에 대한 void 포인터의 벡터

  17. 17

    가변 템플릿 함수에서 오버로드 된 함수에 대한 모호한 호출

  18. 18

    Twig를 사용하여 상위 템플릿에서 하위 템플릿의 변수 집합에 액세스

  19. 19

    템플릿 인수에 대한 템플릿 템플릿 전문화

  20. 20

    함수 템플릿의 선언 부분에 정의 된 경우 임의 형식 속성에 대한 함수 오버로드가 실패합니다.

  21. 21

    스칼라 템플릿 코드 블록 및 값을 템플릿 호출에 대한 인수로 사용 (Play Framework)

  22. 22

    템플릿 템플릿 매개 변수에 대한 추론 가이드

  23. 23

    템플릿 클래스의 템플릿 메서드에 대한 Clang AST

  24. 24

    django 템플릿 상속-여러 하위 템플릿에 대한 views.py

  25. 25

    템플릿 종속 매개 변수에 대한 클래스 템플릿 인수 추론

  26. 26

    재귀 적으로 상속 된 템플릿 기본 클래스의 템플릿 메서드를 호출하는 방법

  27. 27

    템플릿을 사용하여 함수 메서드가 존재하는지 재귀 적으로 확인

  28. 28

    템플릿 메소드 매개 변수의 기본값에 대한 루비 상수?

  29. 29

    upheap 메서드에 대한 재귀 함수 (이 비 재귀 메서드를 재귀에 어떻게 쓸 수 있습니까?)

뜨겁다태그

보관