1. ホーム
  2. c++

C++11:関数の別名を付けるには?[重複しています]。

2023-10-15 18:05:49

質問

名前空間barにFooクラスがあった場合。

namespace bar
{
    class Foo { ... }
};

それならできる。

using Baz = bar::Foo;

というように、名前空間に Baz という名前でクラスを定義したのと同じようになります。

関数にも同じことができるのでしょうか?

namespace bar
{
    void f();
}

そして

using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type

最もクリーンな方法は何でしょうか?

この解決策は、テンプレート関数にも当てはまるはずです。

定義です。 もしあるエンティティBが エイリアス である場合、ソースコードの中で A の使用法(もちろん宣言や定義ではない)をすべて B に置き換えたとしても、(取り除いた)生成コードは同じままである。 例えば typedef A B はエイリアスです。 #define B A は(少なくとも)エイリアスである。 T& B = A はエイリアスではなく、B は間接ポインタとして効果的に実装でき、A は "unaliased" が "immediate semantics" を使用することができます。

どのように解決するのですか?

完全転送を利用して、(多少の手間はかかりますが)関数の別名を定義することができます。

template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
  return f(std::forward<Args>(args)...);
}

この解決策は f がオーバーロードされていたり、関数テンプレートであっても適用されます。