ソリューションは C と C++ で異なり、C++11 と C++11 以前でも異なります。
これらすべてで、関数へのポインターの単純な配列を使用できます。
double (*array[3])() = { &f1, &f2, &f3 };
関数を呼び出すには:
std::cout << (*array[i])() << std::endl;
問題の関数が他のデータに依存できないことを意味するため、これは非常に制限的です。このため、C では通常、次のように作成しますstruct
。
struct F
{
double (*pf)( void* );
void* data;
};
F array[3] = { { &f1, NULL }, { &f2, someData }, { &f3, NULL } };
std::cout << (*array[i].pf)( &data ) << std::endl;
(ただし、特に数値計算では、これが過剰な場合が多くあります。主にコールバックで使用されます。)
C++ では、仮想関数 (各派生クラスでオーバーライドされる) を使用して抽象基本クラスを定義し、さまざまな派生クラスのインスタンスへのポインターを保存するオプションもあります。
class F
{
public:
virtual ~F() {}
virtual double operator()() const = 0;
};
F const* array[3] = { &obj1, &obj2, &obj3 };
std::cout<< (*array[i])() << std::endl;
最後に、C++11 には、std::function
これらすべてをカプセル化する標準オブジェクトがあります。(ただし、これは自分で調べる必要があります。ほとんどの人と同じように、私はまだ C++11 を完全にサポートするコンパイラにアクセスできないため、これを実践することはできませんでした。)