2012-07-30 142 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