2012-07-30 117 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; 

求解的特殊版本,我需要知道,這兩個ProblemTSUBT類型,以便正確地定義類型和調用正確的函數。

僅僅是一個簡單的錯誤還是不可能定義這樣的類?

+0

不應該是'SubT :: a();'? – 2012-07-30 13:48:03

+0

沒關係。 SubT :: func()只是表示一個被調用的靜態函數。這個函數的名字對於這個示例代碼是不重要的。重要的一點是有兩個問題的類型:即主要ProblemT和SumT – 2012-07-30 13:50:35

+3

您誤會了。我的意思是建議專業化應該是遞歸的,並使用嵌套類型。 – 2012-07-30 13:52:02

回答

3

你可以嘗試這樣的事情:

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(); } 
}; 

很顯然,你可以與其他成員函數裝點您的主要Solver模板,你可以訪問專業化等。

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; – 2012-07-30 13:41:38

+2

@ user1562958:您應該在問題中清楚地陳述您的要求,而不是在其他答案的註釋中,例如使用'Solver > nested_solver;'實現必須能夠調用'Problem2 :: f() '和'Problem3 :: f()'...或者任何額外的要求是...(解釋爲什麼你需要這個也可能有幫助,我不知道爲什麼'Problem2 :: f' should not負責調用'Problem3 :: f' ...) – 2012-07-30 13:57:11

+0

@ user1562958我修復了我的答案(根據Luc Danton的評論)。看看它現在是否適合您的需求。 – 2012-07-30 14:13:13