2016-12-14 55 views
0

如果我有一些像這樣的代碼:避免的if-else與模板函數聲明

void function_1(...) 
{ 
    //do something 
} 


void function_2(...) 
{ 
    //do something 
} 


int function_3(...) 
{ 
    //do something 
} 

int main() 
{ 
    .... 
    if (CONSTANT_1) function_1() 
    else if (CONSTANT_2) function_2() 
    else if (CONSTANT_3) function_3() 
    ....  
} 

我想避免的if-else語句和這樣做的主要功能:

int main() 
{ 
    function<CONSTANT>(); 
} 

如何避免使用if-else語句並模擬此行爲?

+0

您是否需要使用模板?如果沒有,你可以使用常量和函數指針的映射。然後調用你從map得到的函數給定的常量。 – uptoNoGood

回答

1

重載和標籤分派。 Base模板會將常量轉換爲唯一類型。然後簡單的重載解決方案將選擇適當的過載。這是假設常數爲constexpr,而不是隻在運行時才知道的。

void function(std::integral_constant<int, CONSTANT_1>) 
{ 
    //do something 
} 


void function(std::integral_constant<int, CONSTANT_2>) 
{ 
    //do something 
} 


int function(std::integral_constant<int, CONSTANT_3>) 
{ 
    //do something 
} 

template<int constant> 
auto function() 
{ 
    return function(std::integral_constant<int, constant>{}); 
} 

int main() 
{ 
    function<CONSTANT_2>(); // calls the second overload 
} 

上述內容已經發出編譯時錯誤當過載是找不到的,而不是鏈接錯誤,如果你專注模板函數,而不是利益。

1

一般來說,你可以專注函數模板:

template<int N> 
void function(); 

template<> 
void function<1>() 
{ 
    //do something 
} 

template<> 
void function<2>() 
{ 
    //do something 
} 

template<> 
void function<3>() 
{ 
    //do something 
} 

這個工作,但也有可能是更好的解決方案,以及。