C 11 での関数のエイリアス
C 11 では、using ディレクティブを使用したクラスのエイリアスは簡単です。ただし、関数のエイリアスの作成はさらに困難であることがわかります。
問題:
次の名前空間と関数の宣言を考えてみましょう:
<code class="cpp">namespace bar { void f(); }</code>
エイリアスを試みていますg = bar::f; を使用した関数"f" は "bar" 名前空間の型ではないため、エラーが発生します。
完全転送によるクリーンなソリューション:
関数エイリアスを作成するには完全転送を使用できます:
<code class="cpp">template<typename... Args> auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) { return f(std::forward<Args>(args)...); }</code>
このソリューションでは、f がオーバーロードされている場合や関数テンプレートであっても、g がすべての引数を f に正しく転送することが保証されます。
エイリアスの定義:
エイリアス、または B は、物質 A の実体であり、A の使用法 (宣言や定義は含まない) に対してソース コード内で B を置き換えても、変更されていないコンパイル結果が得られることを保証します。 code.
例:
g エイリアスを定義した後、次のコードはエイリアスを介して f を呼び出します:
<code class="cpp">g(1, 2, 3); // Calls bar::f(1, 2, 3);</code>
以上がC 11 で関数エイリアスを作成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。