簡體   English   中英

在 C++ 中定義短函數名別名的最安全方法是什么?

[英]What's the safest way to define short function name aliases in C++?

假設我在文件utility.h有一個類Utility

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

然后我發現我longDescriptiveName(...)使用longDescriptiveName(...)函數。 所以就像一個不負責任的 C++ 程序員,當我喝了太多咖啡時,我創建了一個新文件utilitymacros.h並在那里添加以下內容:

#define ldn Utility::longDescriptiveName

現在我在任何使用ldn(...) *.cpp中包含"utilitymacros.h" ,我的心充滿了喜悅,因為輸入 3 個字母比 28 個字母更方便。

問題:是否有比#define更安全(更合適)的方法來做到這一點?

我注意到在包含 boost 標頭之后我必須包含“utilitymacros.h”,我顯然不喜歡它,因為它是沖突的跡象(盡管我得到的 Boost 錯誤不太清楚沖突是什么) .

說明 1:關於代碼可讀性

如果您可能會說這會對代碼可讀性產生負面影響,我向您保證不會,因為它是一小組被大量使用的函數。 一個廣為人知的例子是stringToInteger stoi 另一個是probabilityDensityFunction stoi pdf等。所以如果我想執行以下操作,我認為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:編輯器宏

我使用 Emacs 作為我選擇的 IDE 和 Kinesis 鍵盤,所以你知道我使用了大量的鍵盤宏、自定義鍵盤快捷鍵,以及實際修改我在編輯器中看到的內容與實際存儲在 h/cpp 文件中的內容。 但是,我仍然覺得在一些選擇的情況下使用函數縮寫的簡單性和視覺可讀性(如上所述)確實是我正在尋找的結果(這肯定受到一定程度的影響)。

您可以編寫將調用轉發到實際函數的inline函數,而不是宏:

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

這當然比宏更安全

您可以使用函數引用:

double (&ldn)(double) = Utility::longDescriptiveName;

在你的文本編輯器中配置一個 snippit/宏/類似的東西怎么樣? 這樣你只需要輸入 ldn 或類似的東西,代碼就不必通過預處理器運行,以后很難發現錯誤。

我不知道這是否有幫助,但我認為部分問題可能是使用過於通用的命名空間(或類名,在這種情況下),例如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);
}

我意識到我沒有告訴你任何你不知道的語法; 它更多地提醒我們,命名空間和類的組織和結構本身在使代碼更具可讀性(和可寫性)方面發揮着重要作用。

一種替代方法是重命名您的函數並將其放在命名空間而不是類中,因為它無論如何都是靜態的。 utility.h變成

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

然后你可以把using namespace Utility; 在您的客戶端代碼中。

我知道有很多風格指南都說短名稱是一件壞事,但我不認為遵守某些風格然后規避它的意義。

您可以使用別名模板(C++11 起)。

  using shortName = my::complicate::function::name;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM