2012-07-30 2 views
1

내 프로그램에 대해 해답 클래스를 정의해야 문제 또는 중첩 된 문제를 해결할 수 있습니다.템플릿 형식의 템플릿을 전문화 할 수 있습니까?

template< typename ProblemT > 
struct Solver { 
    static void a() { 
     ProblemT::func(); 
    } 
}; 

template< typename < typename SubT> ProblemT > 
struct Solver<ProblemT< SubT> > { 
    static void a() { 
     ProblemT::func(); 
     SubT::func(); 
    } 
}; 

사용법 : 찾기의 전문 버전에서

Solver<Problem1> solver; 
Solver<Problem2<Problem3> > nested_solver; 

내가 제대로 유형을 정의하고 올바른 함수를 호출하기 위해 모두 ProblemT부제에게 유형을 알아야합니다.

단순한 오류가 있습니까? 아니면 그러한 클래스를 정의 할 수 없습니까?

+0

'SubT :: a();'가 아니어야합니까? –

+0

그건 중요하지 않습니다. SubT :: func()은 호출되는 정적 함수를 나타냅니다. 이 함수의 이름은이 샘플 코드에서 중요하지 않습니다. 중요한 포인트는 두 가지 문제, 즉 주요 ProblemT와 SumT –

+3

의 유형을 잘못 이해하는 것입니다. 나는 전문화가 재귀 적이어야하고 중첩 된 유형을 사용해야한다고 제안하고자했다. –

답변

3

는이 같은 시도 할 수 있습니다 : 당신은 추가 멤버 함수와 기본 Solver 템플릿을 장식 할 수 있습니다, 분명히

template <typename T> 
struct Solver 
{ 
    static void solve() { T::func(); } 
}; 

template <template <typename> class Tmpl, typename U> 
struct Solver<Tmpl<U>> 
{ 
    static void solve() { Tmpl<U>::solve(); } 
}; 

을하는 당신이 할 수있는 전문 분야에서의 접근 등

5

당신이 사용하는 템플릿 템플릿 매개 변수를 수행 할 수 있습니다

template<template <typename> class ProblemT, typename SubT> 
struct Solver<ProblemT<SubT>> 
{ 
    ... 
}; 

// And you use it like this 
Solver<ProblemTemplate<SubProblem>> solver; 
+0

답변 해 주셔서 감사합니다.하지만 내 요구에 정확하게 부합하지 않습니다. 나는 솔버 클래스를 사용하는 다른 일반적인 알고리즘을 가지고있다. 다음과 같이 정의해야합니다. 해답 > nested_solver; –

+2

@ user1562958 :'Solver > nested_solver와 같은 다른 답변에 대한 주석보다는 질문에 명확하게 요구 사항을 명시해야합니다. 구현시'Problem2 :: f()를 호출 할 수 있어야합니다. '및'Problem3 :: f()'... 또는 여러분의 추가 요구 사항이 무엇이든간에 ... (왜 도움이 될 수 있는지에 대한 설명으로, 왜'Problem2 :: f'가 'Problem3 :: f'를 호출하는 책임을 져라.) –

+0

@ user1562958 Luc Danton의 의견에 따라 대답을 고쳤다. 그것이 지금 당신의 필요에 맞는 지보십시오. –