2017-09-08 1 views
2

私は、特定の変数の範囲をチェックし、simpliyfy C++は

if (x < 100) 
{ 
call_1(); 
} 
else if (x < 500) 
{ 
call_2(); 
} 
else 
{ 
call_3(); 
} 

のように同じシグネチャを持つ関数を呼び出すための他の条件は、そのように利用できる任意の標準ライブラリや構造である場合は、複数のC++を持っています条件文に触れることなく拡張できる範囲と関数をマップできます。

答えて

0

ここであなたを助けることができるような「オフシェルフ」の選択肢はありません。あなたが持っている方法は素晴らしく、はっきりしていますが、明快さが維持されているならば、いつでも選択肢を探すことができます。 xがある、または、符号なし整数型、および100のあなたの間隔の倍数であることができれば、例えば、その後、

switch (x/100){ 
case 0: 
    call_1(); 
    break; 
case 1: case 2: case 3: case 4: 
    call_2(); 
    break; 
default: 
    call_3(); 
} 

は、プロジェクトのスケールとして読みやすくなってしまうかもしれません。

8

std::mapを使用すると、関数へのポインタを格納できます。次に、std::map::lower_bound()を使用して、正しい機能を見つけることができます。ここで

が小さい例である:

#include <map> 
#include <limits> 

void call_1() {} 
void call_2() {} 
void call_3() {} 

std::map<int, void(*)()> functions = { 
    { 99, &call_1 }, 
    { 499, &call_2 }, 
    { std::numeric_limits<int>::max(), &call_3 } 
}; 

void call(int x) 
{ 
    functions.lower_bound(x)->second(); 
} 
+1

あなたも、関数ポインタを間接参照する必要はありません: 'functions.lower_bound(X) - >秒();' – Rakete1111

+0

Rakete1111 @、はい、あなたは、右。私は答えを更新しました。ありがとう! – Kane