完全転送を使用して関数エイリアスを定義できます (多少の作業が必要です):
template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
f
の場合でも、この解決策は適用されます オーバーロードおよび/または関数テンプレートです。
constexpr
関数ポインタは関数エイリアスとして使用できます。
namespace bar
{
int f();
}
constexpr auto g = bar::f;
g
を使用する可能性が非常に高い (ただし、言語によって保証されているわけではありません)。 bar::f
を使用 具体的には、これはコンパイラのバージョンと最適化レベルに依存します。
特に、これは次の場合に当てはまります:
- GCC 4.7.1+、最適化なし
- Clang 3.1+、最適化なし
- 最適化された MSVC 19.14+。
これらのコンパイラによって生成されたアセンブリを参照してください。
クラスは型です 、したがって typedef
でエイリアスできます および using
(C++11)
関数はオブジェクトによく似ています であるため、エイリアスを設定するメカニズムはありません。せいぜい、関数ポインタまたは関数参照を使用できます:
void (*g)() = &bar::f;
void (&h)() = bar::f;
g();
h();
同様に、変数をエイリアシングするメカニズムもありません (スルー ポインターまたは参照の略)