Qt には次のような機能がQMetaObject::invokeMethod(QObject * obj, const char * member, ...)
あります。これは、文字列 (メンバー) からメソッドを呼び出します。どうすれば同じ(または同様の)ことができますか?ありがとう)
質問する
1389 次
2 に答える
4
純粋な C++ でこれを行うことはできませんが、この質問で c++ のリフレクション/イントロスペクトについて読むことができます
于 2013-01-14T16:02:06.633 に答える
4
同様のことが a で達成できますmap<std::string, std::function<void()>>
:
std::map<std::string, std::function<void()>> funs;
funs["hello world"] = [] () { std::cout << "hello world"; };
funs["hello world"]();
問題は、どれだけ似ているかです。 通話はどのように「ネイティブ」に見えるべきですか? . 次のようなことができます。
void foobar(int, float);
...
invoke("foobar", 5, 5.f);
しかし、実装はハックに見え、自明ではありません。
関連する問題があります:
可変個引数テンプレートといくつかのテンプレート/仮想手法を使用すると、かなり遠くまで到達できます。次のコードを使用すると、次のようなことができます。
std::string select_string (bool cond, std::string a, std::string b) {
return cond ? a : b;
}
int main () {
Registry reg;
reg.set ("select_it", select_string);
reg.invoke ("select_it", "1 John Wayne"));
reg.invoke ("select_it", "0 John Wayne"));
}
つまり、引数リストは、ネイティブ関数呼び出しの実際の引数リストに分解されます。可変個引数テンプレートを使用すると、多くのことができます。すべきかどうかわかりません。
于 2013-01-14T17:08:22.507 に答える