2016-12-14 8 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() 
    ....  
} 

を私がもし-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 
} 

これは動作しますが、同様に、より良い解決策があるかもしれません。

関連する問題