2017-04-04 158 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語句是不太好的設計的一個指標,並且大多數情況下可以用其他類型的調度來替代,具有虛擬功能。