2017-04-04 79 views
1

所以我们从我的问题定义开始:复杂和复杂的模板

我有超大的switch语句,我只想定义一次。然后在switch语句每个案例都会调用模板函数

即:

switch(whatever) 
{ 
    case whatever::one: 
     dosomething<char>(parameterone, parametertwo); breakl 
    case whatever::two: 
     dosomething<int>(parameterone, parametertwo); break; 
    ... 
} 
} 

这完美的作品。但让我们说我想让事情变得复杂。具体而言,我希望案例陈述能够调用两个函数,即做某件事或超酷的事情。

即:

template<typename F> 
void wrapper(parameterone, parametertwo) 
{ 
    switch(whatever) 
    { 
    case whatever::one: 
     F<char>(parameterone, parametertwo); break; 
    case whatever::two: 
     F<int>(parameterone, parametertwo); break; 
    ... 
    } 
} 
} 

其中F是某种函数指针。然后,我会打电话的包装函数是这样的:

wrapper<dosomething>(...); 

OR

wrapper<superdosomething>(..); 

(注:我真的不希望复制switch语句对于F中的任意有效的函数)

+0

您是否可以控制要作为'wrapper'的模板参数传递的内容? – Angew

回答

2

是,这样的包装可以写出来。我将使用一层代表团,可能需要根据您的真实代码进行调整。

template <class F> 
void wrapper(param1, param2) 
{ 
    switch (whatever) 
    { 
    case whatever::one: 
     F::call<char>(param1, param2); 
     break; 

    case whatever::two: 
     F::call<int>(param1, param2); 
     break; 
    } 
} 


struct DoSomething 
{ 
    template <class T> 
    static void call(param1, param2) { /* your code */ } 
}; 


struct DoSomethingSuperCool 
{ 
    template <class T> 
    static void call(param1, param2) { /* your super-cool code */ } 
}; 

用法:

wrapper<DoSomething>(p1, p2); 
wrapper<DoSomethingSuperCool>(p1, p2); 
0

大多数肯定是你不想要了F-作为一个功能,而是作为一类。这样的类可以是一个模板类,可能有部分或全部专业化(对于一个类而不是对一个功能进行模板专业化要容易得多)。

其他细节不确定。该类可以有一堆静态函数,例如ProcessOne,ProcessTwo等,在特定的开关子句中调用。如果班级有一个国家,他们应该是非静态的,甚至是虚拟的。实现继承将允许您使代码相对紧凑。

通常情况下,巨大的switch语句是不太好的设计的一个指标,并且大多数情况下可以用其他类型的调度来替代,具有虚拟功能。