템플릿 클래스가 서로의 인스턴스를 저장하지 않는 한 서로 의존 할 수 있습니까?

올렉시 크 마라

간단한 템플릿 기반 디자인이 작동하도록 노력하고 있는데 템플릿 상호 의존성을 발견했습니다. 이제 가상 함수를 사용하고 (이 특별한 경우에는) EventHandler 메서드를 전체 클래스 대신 템플릿으로 전환하여이 문제를 해결할 수 있다는 것을 알고 있습니다. 그러나 서로에 대한 포인터 만 사용하는 두 개의 상호 종속 템플릿을 가질 수있는 방법이 있습니까?

이것은 간단한 예입니다.

typename MySocket;

template<typename SocketClass> struct EventHandler {
    void receiveCallback(SocketClass *s) {
    }
};

template <typename HandlerType> class Socket {
    HandlerType *handler;
};

typedef EventHandler<MySocket> MyHandler ;
typedef Socket<MyHandler> MySocket ;

MyHandler h;
MySocket socket;

int main() {
    return 0;
}

이 코드에 대해 컴파일러는 Socket이 재정의되었다는 오류를 표시합니다. 어떤 아이디어? C ++ 11 / 14는 나에게 좋습니다.

스티브 로리 머

당신이 사용하는 구문을 고려할 때 당신이하려는 일은 불가능합니다.

즉, MySocket템플릿에 적절한 매개 변수를 전달할 때까지 유형이 존재하지 않기 때문입니다.

보낸 사람 MySocket에 따라 다릅니다 MyHandler에 차례로 의존하는, MySocket당신이 순환 종속성을 가지고 그 작동하지 않습니다 그래서.

그런 다음 MySocket유효한 C ++가 아닌 형식 이름 으로 정방향 선언하여이 문제를 해결하려고 시도한 것 같습니다 .

이 문제를 해결하는 방법이 있으며 템플릿 템플릿 매개 변수 를 사용하는 것입니다 .

템플릿 템플릿 매개 변수를 사용하면 다른 템플릿을 매개 변수로 템플릿에 전달할 수 있습니다.

template<template<typename> class SocketT>
struct EventHandlerT;

다음 SocketT은 1 개의 템플릿 매개 변수 (따라서 이름 템플릿 템플릿 매개 변수)를 사용 하는 템플릿 자체입니다.

내부 EventHandlerT 는 다음 구체적인 유형을 정의 할 수 있습니다 Socket, 사용하는 EventHandlerT템플릿 매개 변수로 SocketT필요합니다.

template<template<typename> class SocketT>
struct EventHandlerT;
{
    using Socket = SocketT<EventHandlerT>; // Socket is now a concrete type
};

그런 다음의 인스턴스를 만들려면 Socket내부에 정의 된 인스턴스 를 사용합니다.EventHandlerT

using EventHandler = EventHandlerT<SocketT>;
using Socket       = EventHandler::Socket; 

다음은 작동하는 예입니다.

template<template<typename> class SocketT>
struct EventHandlerT
{
    using Socket = SocketT<EventHandlerT>;

    void receiveCallback(Socket* s)
    {
    }
};

template <typename HandlerT>
struct SocketT
{
    HandlerT* handler;
};

int main()
{
    using EventHandler = EventHandlerT<SocketT>;
    using Socket       = EventHandler::Socket;

    EventHandler handler;
    Socket       socket;

    socket.handler = &handler;
    handler.receiveCallback(&socket);

    return 0;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

템플릿 매개 변수를 사용하지 않는 템플릿 클래스의 메서드에 대한 컴파일러 최적화가 있습니까?

분류에서Dev

인스턴스를 만들지 않고 한 클래스가 Java에서 다른 클래스를 확장하는지 확인할 수 있습니까?

분류에서Dev

템플릿 클래스가 서로의 인스턴스를 가리킬 수 있습니까?

분류에서Dev

템플릿 인수가 다른 동일한 클래스는 서로의 개인 필드에 액세스 할 수 없습니다.

분류에서Dev

템플릿 클래스의 템플릿 유형에 대한 매개 변수를 추가 할 수 있습니까?

분류에서Dev

SQL Server에서 임시 테이블을 포함하는 동일한 저장 프로 시저의 여러 인스턴스를 실행할 수 있습니까?

분류에서Dev

한 클래스의 인스턴스가 다른 클래스의 인스턴스에서 변수를 변경할 수 있습니까?

분류에서Dev

C ++의 다른 템플릿 함수에서 템플릿 클래스에 속하는 중첩 유형을 어떻게 사용할 수 있습니까?

분류에서Dev

생성자가 C ++에서 인스턴스화 할 적절한 하위 클래스를 선택하는 추상 클래스를 작성할 수 있습니까?

분류에서Dev

템플릿 클래스를 C ++에서 템플릿이 아닌 클래스로 "래핑"할 수 있습니까?

분류에서Dev

pop_back 함수가있는 클래스 템플릿 벡터가 의도 한대로 작동하지 않습니다.

분류에서Dev

하나 및 두 개의 템플릿 인수가있는 템플릿 클래스

분류에서Dev

하나 및 두 개의 템플릿 인수가있는 템플릿 클래스

분류에서Dev

템플릿 전문화 정의에서 한 클래스의 멤버 typedef를 템플릿 매개 변수로 사용할 수 없습니다.

분류에서Dev

동일한 기본 클래스를 상속하는 두 클래스가 서로의 함수를 사용할 수 있습니까?

분류에서Dev

생성자가있는 클래스를 C ++의 템플릿 인스턴스화에서 형식 매개 변수로 사용

분류에서Dev

파생 클래스의 템플릿 인수를 CRTP의 기본으로 전달할 수 있습니까?

분류에서Dev

C ++ 명시 적으로 인스턴스화 된 템플릿 메서드가 가상 메서드를 재정의 할 수없는 이유는 무엇입니까?

분류에서Dev

가변 템플릿 클래스 팩의 각 유형에서 유형 이름이 아닌 템플릿 인수를 어떻게 복구 할 수 있습니까?

분류에서Dev

템플릿 하위 클래스를 다른 템플릿 인스턴스화로 캐스팅 할 수 없습니다.

분류에서Dev

클래스가 템플릿의 템플릿 인스턴스화에서 상속되는지 확인

분류에서Dev

동일한 클래스이지만 템플릿 인수가 다른이 연산자 오버로딩을 어떻게 수정할 수 있습니까?

분류에서Dev

동일한 클래스이지만 템플릿 인수가 다른이 연산자 오버로딩을 어떻게 수정할 수 있습니까?

분류에서Dev

템플릿 클래스가있는 클래스의 인스턴스화에 람다 함수를 전달하는 방법

분류에서Dev

클래스 템플릿의 매개 변수를 기반으로 클래스 메서드와 전역 메서드를 호출 할 수 있습니까?

분류에서Dev

클래스를 인스턴스화하는 올바른 방법으로 인증서의 경로 체인을 확인할 수 있습니다.

분류에서Dev

각 인스턴스 ID를 기반으로하는 IAM 권한으로 AWS AutoScalingGroup의 각 인스턴스를 구성 할 수 있습니까?

분류에서Dev

Django의 클래스에서 템플릿에 콘텐츠를로드하는 데 문제가 있습니다.

분류에서Dev

유형이 아닌 템플릿 매개 변수가있는 클래스가 주어지면 인수의 값 쌍에 대해 클래스가 서로 친구가 될 수 있습니까?

Related 관련 기사

  1. 1

    템플릿 매개 변수를 사용하지 않는 템플릿 클래스의 메서드에 대한 컴파일러 최적화가 있습니까?

  2. 2

    인스턴스를 만들지 않고 한 클래스가 Java에서 다른 클래스를 확장하는지 확인할 수 있습니까?

  3. 3

    템플릿 클래스가 서로의 인스턴스를 가리킬 수 있습니까?

  4. 4

    템플릿 인수가 다른 동일한 클래스는 서로의 개인 필드에 액세스 할 수 없습니다.

  5. 5

    템플릿 클래스의 템플릿 유형에 대한 매개 변수를 추가 할 수 있습니까?

  6. 6

    SQL Server에서 임시 테이블을 포함하는 동일한 저장 프로 시저의 여러 인스턴스를 실행할 수 있습니까?

  7. 7

    한 클래스의 인스턴스가 다른 클래스의 인스턴스에서 변수를 변경할 수 있습니까?

  8. 8

    C ++의 다른 템플릿 함수에서 템플릿 클래스에 속하는 중첩 유형을 어떻게 사용할 수 있습니까?

  9. 9

    생성자가 C ++에서 인스턴스화 할 적절한 하위 클래스를 선택하는 추상 클래스를 작성할 수 있습니까?

  10. 10

    템플릿 클래스를 C ++에서 템플릿이 아닌 클래스로 "래핑"할 수 있습니까?

  11. 11

    pop_back 함수가있는 클래스 템플릿 벡터가 의도 한대로 작동하지 않습니다.

  12. 12

    하나 및 두 개의 템플릿 인수가있는 템플릿 클래스

  13. 13

    하나 및 두 개의 템플릿 인수가있는 템플릿 클래스

  14. 14

    템플릿 전문화 정의에서 한 클래스의 멤버 typedef를 템플릿 매개 변수로 사용할 수 없습니다.

  15. 15

    동일한 기본 클래스를 상속하는 두 클래스가 서로의 함수를 사용할 수 있습니까?

  16. 16

    생성자가있는 클래스를 C ++의 템플릿 인스턴스화에서 형식 매개 변수로 사용

  17. 17

    파생 클래스의 템플릿 인수를 CRTP의 기본으로 전달할 수 있습니까?

  18. 18

    C ++ 명시 적으로 인스턴스화 된 템플릿 메서드가 가상 메서드를 재정의 할 수없는 이유는 무엇입니까?

  19. 19

    가변 템플릿 클래스 팩의 각 유형에서 유형 이름이 아닌 템플릿 인수를 어떻게 복구 할 수 있습니까?

  20. 20

    템플릿 하위 클래스를 다른 템플릿 인스턴스화로 캐스팅 할 수 없습니다.

  21. 21

    클래스가 템플릿의 템플릿 인스턴스화에서 상속되는지 확인

  22. 22

    동일한 클래스이지만 템플릿 인수가 다른이 연산자 오버로딩을 어떻게 수정할 수 있습니까?

  23. 23

    동일한 클래스이지만 템플릿 인수가 다른이 연산자 오버로딩을 어떻게 수정할 수 있습니까?

  24. 24

    템플릿 클래스가있는 클래스의 인스턴스화에 람다 함수를 전달하는 방법

  25. 25

    클래스 템플릿의 매개 변수를 기반으로 클래스 메서드와 전역 메서드를 호출 할 수 있습니까?

  26. 26

    클래스를 인스턴스화하는 올바른 방법으로 인증서의 경로 체인을 확인할 수 있습니다.

  27. 27

    각 인스턴스 ID를 기반으로하는 IAM 권한으로 AWS AutoScalingGroup의 각 인스턴스를 구성 할 수 있습니까?

  28. 28

    Django의 클래스에서 템플릿에 콘텐츠를로드하는 데 문제가 있습니다.

  29. 29

    유형이 아닌 템플릿 매개 변수가있는 클래스가 주어지면 인수의 값 쌍에 대해 클래스가 서로 친구가 될 수 있습니까?

뜨겁다태그

보관