2010-04-10 3 views
1
template <typename T> 
class A 
{ 
public: 
    T t; 
    void Do (void) 
    { 
     t.doSomething(); 
    } 
}; 

위의 경우 템플릿 인스턴스화시 't'생성자에 매개 변수를 어떻게 제공합니까?인스턴스화시 템플릿 유형의 ctor 인수

같이, I가 있었다면 :

class P1 
{ 
public: 
    P1 (int i, int a) {} 
}; 

class P2 
{ 
public: 
    P2 (int a) {} 
}; 

I는 (A)에 템플릿 파라미터로서 모두 P1 및 P2를 사용하고자 .. 현재 난의 ctor에로 P1/P2의 인스턴스를 공급하고있어, 여기서 't'는 copy-ctor를 사용하여 초기화됩니다. (UncleBens를 들어, G 맨)

더 큰 그림 :

나는 거기에 악마의 많은 데이터 구조 (DS)의 전체 많다. 이 DS 각각은 ui에 표시된 데이터베이스에 저장되고 RPC를 통해 처리됩니다. 이 DS 각각에 대해 유효성을 검사 할 클래스가 있습니다. 유효성 검사 클래스는 유효성 검사를 수행하는 상황에 따라 다르게 동작해야합니다. DB에서 가져온 데이터의 검증에 실패하면 '개발자가 이해할 수있는'오류가 기록되고 어설 션으로 사망해야합니다. rpc-client에서 얻은 데이터 검증에 실패하면 서버가 적절한 오류에 응답해야합니다. rpc 서버에서 얻은 데이터 검증에 실패하면 로그에 기록해야하며 클라이언트가 중단되어야합니다. UI에서 유효성 검사가 실패하면 사용자에게 알림을 보내야합니다.

나는 컴파일 타임에 템플릿 매개 변수로 선택할 수있는 정책을 '오류 처리'로 만들기로 결정했습니다. 그러나 이러한 오류 처리 메커니즘에는 각각 다른 방법이 필요합니다. 그리고, 내가 붙어있는 곳.

현재로서는 복제 형식을 기반으로하는 메커니즘이 있는데, 유형을 두 번 언급하고 있습니다 (템플릿에 대한 매개 변수로 한 번, 인스턴스화의 ctor에 대한 다시 한 번). 중복됩니다.

나는 다른 사람들이 어떻게 그런 경우를 해결할 것인지 알고 싶다. 편집 질문에 대한 응답으로

+0

: 당신의 유형은 항상없는 경우 int
, 당신이 길을 갈 수 있습니다. 나는 나의 대답을 업데이트했다. –

+2

@Joe 현재 진행중인 방식에 어떤 문제가 있습니까? –

+0

@ neil : 템플릿 인스턴스화가 약간보기 흉하게 보입니다. like ... A x (P2 (1)); –

답변

2
template <typename T> 
class A 
{ 
public: 
    T t; 
    void Do (void) 
    { 
     t.doSomething(); 
    } 
    A() : t(parameters) {}; //Like this 
} 

: 당신은 템플릿 클래스 인수의 변수 번호가있는 경우
는 , 당신은 C + +0 varadic 템플릿을 기다릴 필요가있다.

+0

빌리 : 템플릿 인스턴스화 당시 .. 나는 내 질문에 이것을 언급해야한다고 생각한다. –

+0

@Joe Steeve : 당신은 수업의 일원입니다. 클래스가 생성 될 때 t가 생성됩니다. 함수가 호출 될 때 t를 만들고 싶으면 함수의 멤버로 만들고 거기에서 구성하십시오. –

+0

@billy : 'A'에는 많은 기능이 있습니다. A는 'T'에 함수를 사용합니다. T는 기본적으로 정책을 정의합니다 .. –

0
template <typename T, int i, int a> 
class A 
{ 
public: 
    T t; 
    A() : t(i, a) 
    { 
    } 
    void Do (void) 
    { 
     t.doSomething(); 
    } 
} 

A<MyT, 5, 8> a; 

이것은 고정 된 수의 인수에 대해 작동합니다.


편집 : C++ 0X없이
, 당신은 아마도 인수의 다른 수에 대한 몇 가지 템플릿을 제공해야합니다.


편집 : 당신이 할 수없는, C++ 03에서

template <typename T, typename ARG1, ARG VAL1> 
class A 
{ 
    T t; 

    public: 
    A() : t(VAL1) 
    { 
    } 
}; 
+0

+1 분 47 초. A 내부의 T 템플릿의 매개 변수 수를 알아야합니다. –

+0

@vlad : 간단한 예를 들려 줄 수 있습니까? –

+1

@Joe : C++ 0x에서는'template '와'A() : t (i ...)'를 사용할 수 있습니다. 그러나 이것은 이상한 대답입니다. 작은 문법적 설탕의 경우, 각 A가 다른 유형이라고 걱정하지 않습니까 ?? – UncleBens

관련 문제