14

c++クラス関数のエイリアスを書く簡単な方法があるかどうか疑問に思いました。たとえば、listコンテナオブジェクトがある場合、論理関数は次のようになります。

    int list::length() { return len; }

しかし、プログラマーが使用する可能性のある別の論理エイリアスは、

    int list::size() { return len; }

それで、両方の関数を完全な本体で書く代わりに、コンパイル時に重複しないようlist::size()にエイリアスを作成する方法はありlist::length()ますか?むしろ同じ関数を参照しますか?

でこれを行うことができることを読みましたが#define、完全にスコープ外のどこかで他のコードネーム(つまり「サイズ」変数)と混同したくありません。
また、関数ポインターで修正できることも読みましたが、これは正確にはエイリアスではなく(逆参照を適用する必要があるため)、関数ポインターに宣言を与えることもできず、ユーザーに紛らわしいヘルプラインを提供します(私は思うでしょう)、さらに、コードを別のオブジェクト内にネストする必要がある場合は混乱します(スコープを調整する必要があります)。

私の推測の1つは、ほとんどの最適化コンパイラーによって、以下が直接関数エイリアスと見なされるかどうかです。

    inline int list::length() { return len; }
    inline int list::size() { return length(); }

または、C ++の厳密な「エイリアス」構文はありますか?(私は何も見つけることができませんでした-確かではありませんでした)
それでは、これを行うための最も効率的な方法は何でしょうか?

編集:それは私の好奇心にすぎないので、私は質問をま​​とめるために答えを受け入れました。良い情報をお持ちの方は、コメントや回答を追加してください。回答を変更することもあります。

4

1 に答える 1

6

これを行うためにプリプロセッサと#defineを使用しません。一般に、プリプロセッサはC++の最後の手段です。プリプロセッサのマクロを使用することのさまざまな悪に関するセクションも含まれているインライン関数に関するこのC++FAQを参照してください。

私が使用するアプローチは、次のようなことを行う、より複雑な関数とインターフェイスを備えたいくつかの異なるエイリアスを持つ関数を持つことです。

int list::length(string xString, int iValue) {
  int iReturnValue = 0;  // init the return value
  //  do stuff with xString and iValue and other things
  return iReturnValue;
}

次に、エイリアスに対して次のような操作を行います。

inline int list::size(string xString, int iValue) {return length(xString, iValue);}

インラインは基本的に、エイリアスを実際の関数呼び出しに置き換えるだけです。

このスタックオーバーフローの投稿も参照してください。関数の実装に複数の名前を付ける。それはあなたがこれをしたくないかもしれないいくつかの理由を提供します。

于 2012-11-10T02:19:45.360 に答える