C++ 関数呼び出しリフレクション テクノロジー: パラメーターの受け渡しと戻り値の動的アクセス

王林
リリース: 2024-05-05 09:48:01
オリジナル
878 人が閲覧しました

C 関数呼び出しリフレクション テクノロジにより、実行時に関数のパラメータと戻り値の情報を動的に取得できます。 typeid(decltype(...)) および decltype(...) 式を使用して、パラメータと戻り値の型情報を取得します。リフレクションを通じて、関数を動的に呼び出し、ランタイム入力に基づいて特定の関数を選択できるため、柔軟でスケーラブルなコードが可能になります。

C++ 函数调用反射技术:参数传递和返回值的动态访问

#C 関数呼び出しリフレクション テクノロジ: パラメーターの転送と戻り値の動的アクセス

関数呼び出しリフレクションは、関数呼び出しの一種です。実行時のリフレクション 関数情報を取得および操作するための強力な手法。 C コンパイラのメタデータ情報を活用することで、関数のパラメータ、戻り値、型情報に動的にアクセスでき、柔軟性と拡張性の高いコードが可能になります。

パラメータの受け渡し

関数のパラメータ情報を取得するには、

typeid(decltype(...)) を使用してパラメータのタイプ情報の type。 `cpp// 関数パラメータの型情報を取得します

include

class MyClass {

public:

void Function(int a, double b, std::string c) {
    // ...
}
ログイン後にコピー

};

int main() {

using namespace std;
auto p = &MyClass::Function;

// 获取参数类型
cout << typeid(decltype(p)).name() << endl;  // MyClass::Function(int, double, std::string)
ログイン後にコピー

}

**返回值**

要获取函数的返回值类型信息,可以使用 `decltype(...)` 表达式:
ログイン後にコピー

// 関数の戻り値の型情報を取得します

include < type_traits>

class MyClass {

public:

int Function() {
    // ...
}
ログイン後にコピー

};

int main() {

using namespace std;
auto p = &MyClass::Function;

// 获取返回值类型
cout << typeid(decltype(p())).name() << endl;  // int
ログイン後にコピー

}

**实战案例:动态函数调用**

假设我们有一个包含一系列以不同方式接受参数并生成不同类型结果的函数的类 `MyFunctions`。我们可以使用函数调用反射来动态地调用这些函数,并根据运行时的输入选择特定的函数:
ログイン後にコピー

// 関数を動的に呼び出す

include

include

class MyFunctions {

public:

int Sum(int a, int b) {
    return a + b;
}

double Divide(double a, double b) {
    return a / b;
}
ログイン後にコピー

} ;

int main() {

using namespace std;
MyFunctions functions;

// 获取函数指针
auto sumPtr = &MyFunctions::Sum;
auto dividePtr = &MyFunctions::Divide;

// 根据输入动态选择函数
function<double(double, double)> func;
if (choice == "sum") {
    func = function<double(double, double)>(sumPtr);
} else if (choice == "divide") {
    func = function<double(double, double)>(dividePtr);
}

// 调用动态选择后的函数
double result = func(10.0, 5.0);
cout << result << endl;  // 输出:2.0
ログイン後にコピー

}

以上がC++ 関数呼び出しリフレクション テクノロジー: パラメーターの受け渡しと戻り値の動的アクセスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート