将模板类传递给模板函数

时间:2014-06-16 22:06:47

标签: c++ templates c++11

我忘记了这一刻的语法。有人可以帮忙吗?基本上下面是我想要做的。如果需要,我不介意将其设置为采用两个模板参数,如果这更容易,则表示runSchedule<SchedT, TaskT>()。另外,如果您可以评论如何让使用别名适用于scheduler_type,并scheduler_type::task_type被识别为函数中的类型。

#include <iostream>                                                                                                                                                                                                                 

class TestTask  {                                                                                                                                                                                                                   
public:                                                                                                                                                                                                                             
    int x;                                                                                                                                                                                                                          
};                                                                                                                                                                                                                                  

template <typename TaskT>                                                                                                                                                                                                           
class TestScheduler {                                                                                                                                                                                                               
public:                                                                                                                                                                                                                             
    typedef  TaskT task_type;                                                                                                                                                                                                       
    int y;                                                                                                                                                                                                                          
};                                                                                                                                                                                                                                  

template <template<class> class SchedT>                                                                                                                                                                                             
void runSchedule()  {                                                                                                                                                                                                               
    typedef  SchedT scheduler_type;                                                                                                                                                                                                
    scheduler_type sched;                                                                                                                                                                                                           
    scheduler_type::task_type task;                                                                                                                                                                                                 
}                                                                                                                                                                                                                                   

int main() {                                                                                                                                                                                                                        
    runSchedule<TestScheduler<TestTask> >();                                                                                                                                                                                        
}      

2 个答案:

答案 0 :(得分:4)

您不需要模板模板参数来实现您的目标。

template < class SchedT>
void runSchedule()  {
    typedef SchedT scheduler_type;  // <-- typedef syntax was backwards
    scheduler_type sched;
    typename scheduler_type::task_type task;
    // ^^^^^ need typename keyword when referring to nested dependent type
}

答案 1 :(得分:2)

template<class> class SchedT函数参数中的template?替换为class SchedT

早期的语法是传递template,后者是template生成的类。