2013-05-05 3 views
0

내 응용 프로그램에서 간단한 "파이프 및 필터"유형 아키텍처를 구현하려고합니다. 하나의 입력과 하나의 출력 유형 매개 변수를 갖는 모든 필터에 대해 공통 기본 클래스를 갖게됩니다. 모든 필터에 대해 다음 필터를 등록하므로 간단한 체인을 형성합니다. 하나의 작은 문제가 있습니다 : 어떻게 다음 필터의 출력 유형을 유형 매개 변수로 표시해야합니까 (예 : 프롤로그에서 _)? 다음 객체의 입력은 현재 필터의 출력과 일치해야하지만 현재 필터는 출력 유형을 알지 못합니다. 다음 필터의).C++에서 사용되는 임의의 템플릿 매개 변수 일 수 있습니까?

class IFilter 
{ 
    std::auto_ptr<TIn> params; 
    IFilter *nextFilter; 
public: 
    typedef TIn TInType; 
    typedef TOut TOutType; 

    void SetParams(std::auto_ptr<TIn> param) { ...irrelevant code... } 
    virtual void Execute() = 0; 
    void Register(IFilter<TOutType, ???> *filter) { ...irrelevant code... } 
}; 
+0

긴 체인을 원하십니까? 그렇다면 다른 필터를 사용하여 필터를 작성하면 유형이 변경되므로 결과는 다른 값이어야합니다. 또는 A = B라는 필터와 B-> C라는 필터를 가지고 있다면 그 결과는 A-> C입니다. 등록이 filter2s 입력을 filter1 입력에 후크하는 경우 새 값이 필요하지 않습니다. 다음 질문 : 추상 인터페이스가 필요합니까, 아니면 충분히 좋은 패턴입니까? 암묵적인 변환은'double'을'int'로 바꾸는 것이 어떻습니까? 당신은 신경 쓰지 않습니까, 차단하고 싶지 않습니까? – Yakk

답변

0

그냥 템플릿 함수를 만듭니다

template <class In, class Out> 
class Filter 
{ 
public: 
    template <class T> 
    void Register(Filter<Out, T>*) 
    { 

    } 
}; 

int main() 
{ 
    Filter<int, float> f1; 
    Filter<float, double> f2; 
    f1.Register(&f2); 
    return 0; 
} 
0

않을까요 템플릿 기능 작업을?

template<typename TIn, typename TOut> 
struct Filter { 
    template<typename NextTOut> 
    void reg(Filter<TOut, NextTOut> *filter) {}; 
}; 

template<typename TIn, typename TOut> 
struct Filter2 : Filter<TIn,TOut> { 
}; 

template<typename TIn, typename TOut> 
struct Filter3 : Filter<TIn,TOut> { 
}; 

int main() 
{ 
    Filter2<int,bool> f2; 
    Filter3<bool,char> f3; 

    f2.reg(&f3); 

} 
0

기본적으로, 당신이 말하고있는 것은

Filter<int, float> f1; 
Filter<float, double> f2; 

f1->f2로 구성되어 있지만 f2->f1 할 수 있다는 것입니다. 그건 상당히 사소한 일입니다. 이것은 한 방법이다 :

template<typename Tin, Tout> 
class IFilter { 
    // ... 
    template<typename U> 
    std::auto_ptr<IFilter<Tin, U> > 
    operator->(std::auto_ptr<IFilter<Tout, U> > second) const 
    { 
    return std::auto_ptr<IFilter<Tin, U> >(
     new CompositeFilter(this, second)); 
    } 
}; 

컴파일러는 제 파일러 (Tout)의 출력 형태는 제 2 필터의 입력 종류가 아닌 경우에는 그 불평한다. 이 경우에는 일치하는 operator->이 없습니다.

관련 문제