文字列から関数を呼び出す簡単な方法があるかどうか疑問に思います。 'if' と 'else' を使用する簡単な方法を知っています。
int function_1(int i, int j) {
return i*j;
}
int function_2(int i, int j) {
return i/j;
}
...
...
...
int function_N(int i, int j) {
return i+j;
}
int main(int argc, char* argv[]) {
int i = 4, j = 2;
string function = "function_2";
cout << callFunction(i, j, function) << endl;
return 0;
}
これが基本的なアプローチです
int callFunction(int i, int j, string function) {
if(function == "function_1") {
return function_1(i, j);
} else if(function == "function_2") {
return function_2(i, j);
} else if(...) {
} ...
...
...
...
return function_1(i, j);
}
もっと簡単なものはありますか?
/* New Approach */
int callFunction(int i, int j, string function) {
/* I need something simple */
return function(i, j);
}
ベストアンサー1
あなたが説明したものは反射C++ ではサポートされていません。ただし、何らかの回避策があるかもしれません。たとえば、この非常に具体的なケースでは、std::map
関数 (オブジェクト) の名前を関数ポインターにマップする を使用できますstd::string
。これは、まったく同じプロトタイプを持つ関数の場合、思ったよりも簡単かもしれません。
#include <iostream>
#include <map>
int add(int i, int j) { return i+j; }
int sub(int i, int j) { return i-j; }
typedef int (*FnPtr)(int, int);
int main() {
// initialization:
std::map<std::string, FnPtr> myMap;
myMap["add"] = add;
myMap["sub"] = sub;
// usage:
std::string s("add");
int res = myMap[s](2,3);
std::cout << res;
}
はmyMap[s](2,3)
文字列にマップされた関数ポインタを取得しs
、この関数を呼び出して、それに2
と3
を渡すので、この例の出力は次のようになることに注意してください。5