8

Utilityファイルにクラスがあるとしますutility.h

class Utility {
public:
    static double longDescriptiveName(double x) { return x + 42; }
};

そして、私は関数longDescriptiveName(...)LOTを使用していることがわかりました。ですから、コーヒーを飲みすぎたときの無責任なC ++プログラマーのように、新しいファイルを作成して、utilitymacros.hそこに次のファイルを追加します。

#define ldn Utility::longDescriptiveName

今、私は私が使用する"utilitymacros.h"すべての場所に含め、私の心は、28文字に対して3文字を入力することがどれほど便利であるかについての喜びに満ちています。*.cppldn(...)

質問:これを行うよりも安全な(より適切な)方法はあり#defineますか?

ブーストヘッダーを含めた後、「utilitymacros.h」を含める必要があることに気づきました。これは、衝突の兆候であるため、明らかに気に入らないものです(ただし、発生するブーストエラーは、衝突が何であるかについてはあまり明確ではありません)。 。

明確化1:コードの可読性について

これがコードの可読性に悪影響を与えると言うかもしれませんが、それは多くの場合に使用される関数の小さなセットであるため、そうではないことを保証します。広く知られている例はstoi、ですstringToInteger。もう1つはpdfprobabilityDensityFunctionなどです。したがって、次のことを実行したい場合はstoi、私の意見ではより読みやすくなります。

int x = stoi(a) + stoi(b) + stoi(c) + stoi(d);

よりも:

int x = Utility::stringToInteger(a) + Utility::stringToInteger(b)
        + Utility::stringToInteger(c) + Utility::stringToInteger(d);

または:

int x = Utility::stringToInteger(a);
x += Utility::stringToInteger(b);
x += Utility::stringToInteger(c);
x += Utility::stringToInteger(d);

明確化2:エディターマクロ

私は選択したIDEとKinesisキーボードとしてEmacsを使用しているので、たくさんのキーボードマクロ、カスタムキーボードショートカットを使用し、エディターに表示されるものとh/cppファイルに実際に保存されているものを実際に変更します。しかし、それでも、いくつかの選択されたケースで関数の省略形を使用することの単純さと視覚的な読みやすさ(上記で論じたように)は、本当に私が探している結果であるように感じます(これは確かにある程度の影響を受けます)。

4

6 に答える 6

14

inlineマクロの代わりに、呼び出しを実際の関数に転送する関数を作成できます。

inline double ldn(double x)
{
   return Utility::longDescriptiveName(x);
}

それは確かにマクロより安全です。

于 2012-12-30T16:14:50.203 に答える
7

関数参照を使用できます。

double (&ldn)(double) = Utility::longDescriptiveName;
于 2012-12-30T16:15:27.887 に答える
3

テキストエディタでスニピット/マクロ/類似のものを設定するのはどうですか?このようにすると、ldnなどと入力するだけで、コードをプリプロセッサで実行する必要がなくなり、後でバグを見つけるのが難しくなります。

于 2012-12-30T16:13:29.023 に答える
2

これが役立つかどうかはわかりませんが、問題の一部は、などの過度に一般的な名前空間(この場合はクラス名)の使用にあると思いますUtility

の代わりにUtility::stringToInteger

namespace utility {
  namespace type_conversion {
    namespace string {
      int to_int(const std::string &s);
    }
  }
}

次に、この関数は次のようにローカルで使用できます。

void local_function()
{
  using namespace utility::type_conversion::string;

  int sum = to_int(a) + to_int(b) + to_int(c) + to_int(d);
}

同様に、クラス/構造体と静的関数が使用されている場合(そしてこれには正当な理由がある可能性があります)、次のようなものがあります

strut utility {
  struct type_conversion {
    struct string {
      static int to_int(const std::string &s);
    };
  };
};

ローカル関数は次のようになります。

void local_function()
{
  typedef utility::type_conversion::string str;

  int sum = str::to_int(a) + str::to_int(b)
              + str::to_int(c) + str::to_int(d);
}

私はあなたがまだ知らなかった構文についてあなたに何も話していないことを理解しています。名前空間とクラスの編成と構造自体が、コードをより読みやすく(そして書きやすく)する上で重要な役割を果たしているという事実をより思い出させてくれます。

于 2012-12-30T16:51:20.843 に答える
2

とにかく静的であるため、1つの代替方法は、関数の名前を変更し、クラスではなく名前空間に配置することです。utility.hになります

namespace Utility {
    // long descriptive comment
    inline double ldn(double x) { return x + 42; }
}

次にusing namespace Utility;、クライアントコードを入力できます。

短い名前は悪いことだと言っているスタイルガイドがたくさんいることは知っていますが、あるスタイルに従い、それを回避する意味はわかりません。

于 2012-12-31T15:22:07.680 に答える
0

エイリアステンプレートを使用できます(C ++ 11以降)。

  using shortName = my::complicate::function::name;
于 2021-06-09T14:29:27.437 に答える