1

Qt には次のような機能がQMetaObject::invokeMethod(QObject * obj, const char * member, ...)あります。これは、文字列 (メンバー) からメソッドを呼び出します。どうすれば同じ(または同様の)ことができますか?ありがとう)

4

2 に答える 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 に答える