C 11: 関数のエイリアス
C では、 using キーワードを使用してクラスのエイリアスを作成できます。ただし、同じ機能を関数に対して直接使用することはできません。この記事では、関数のエイリアスが可能かどうかという問題を検討し、完全転送を使用した解決策を提供します。
目的:
関数のエイリアスを作成できるかどうかを確認するC を実行し、そうであれば、これを達成するための最もクリーンな方法を見つけます。
問題ステートメント:
次のことを検討してください。次のコード:
namespace bar
{
void f();
}
関数 bar::f に g という名前のエイリアスを作成したいと思います。ただし、次の試行ではエラーが発生します:
using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type
解決策:
関数エイリアスを作成するには、テンプレートと完全転送の組み合わせを使用できます。 。これを実現する方法の例を次に示します。
template
auto g(Args&&... args) -> decltype(f(std::forward(args)...)) {
return f(std::forward(args)...);
}
この解決策は、任意の数の引数を取る汎用テンプレート関数を作成することで機能します。次に、完全転送を使用して、これらの引数を元の関数 f に転送します。これにより、エイリアスに適用された可能性のある型変換やポインター逆参照に関係なく、呼び出された関数が元の形式で引数を受け取ることが保証されます。
注:
この解決策オーバーロードされた関数や関数テンプレートに対しても機能し、指定された引数に基づいて正しい関数が呼び出されることを保証します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3