std::function
C ++ 11を使用すると、マップを使用してこれをかなり簡単に行うことができます。
#include <map>
#include <functional>
#include <string>
#include <iostream>
std::string f1(int) { return "f1"; }
std::string f2(int) { return "f2"; }
std::map<int, std::function<std::string(int)> > funcs = {
{1,f1},
{2,f2}
};
int main() {
std::cout << funcs[1](100) << "\n";
}
C ++ 11がない場合は、代わりにBoostを使用するか、代わりにstd::function
独自のタイプをロールする必要があります。昔ながらの関数ポインタを使用することもできますが、便利なもの(std::bind
/ boost::bind
、ファンクターオブジェクト、ラムダ関数など)が除外されます。関数が実装するインターフェイスを使用して型階層を定義することもできます。たとえば、C++03では次のように機能します。マップが初期化される方法について:
#include <map>
#include <functional>
#include <string>
#include <iostream>
std::string f1(int) { return "f1"; }
std::string f2(int) { return "f2"; }
std::map<int, std::string(*)(int)> funcs = {
std::make_pair(1,f1),
std::make_pair(2,f2)
};
int main() {
std::cout << funcs[1](100) << "\n";
}
または、これにより、好きな種類のファンクターオブジェクトを作成できます。
#include <map>
#include <string>
#include <iostream>
struct thing {
virtual std::string operator()(int) const = 0;
};
struct f1 : thing {
std::string operator()(int) const { return "f1"; }
};
struct f2 : thing {
std::string operator()(int) const { return "f2"; }
};
// Note the leak - these never get deleted:
std::map<int, thing*> funcs = {
std::make_pair(1,new f1),
std::make_pair(2,new f2)
};
int main() {
std::cout << (*funcs[1])(100) << "\n";
}