在C++中定义短函数名称别名最安全的方法是什么?

Ala*_*ing 7 c++ macros alias function c-preprocessor

假设我Utility在一个文件中有一个类utility.h:

class Utility {
public:
    static double longDescriptiveName(double x) { return x + 42; }
};
Run Code Online (Sandbox Code Playgroud)

然后我发现我使用的功能longDescriptiveName(...)很多.就像一个不负责任的C++程序员,当我喝了太多咖啡时,我创建了一个新文件utilitymacros.h并在其中添加以下内容:

#define ldn Utility::longDescriptiveName
Run Code Online (Sandbox Code Playgroud)

现在我把它包括"utilitymacros.h"*.cpp我使用的任何地方ldn(...),我的心里充满了快乐,因为输入3个字母对28更加方便.

问题:这样做比使用更安全(更合适)#define吗?

我注意到在包含boost标题之后我必须包含"utilitymacros.h",我显然不喜欢它,因为它是冲突的标志(尽管我得到的Boost错误并不是很清楚冲突是什么) .

澄清1:关于代码可读性

如果您可能会说这会对代码可读性产生负面影响,我向您保证不会,因为它是一小部分功能使用很多.被广泛知道的一个例子是stoistringToInteger.另一种是pdfprobabilityDensityFunction等,所以如果我要做到以下几点,stoi在我看来更具可读性:

int x = stoi(a) + stoi(b) + stoi(c) + stoi(d);
Run Code Online (Sandbox Code Playgroud)

比:

int x = Utility::stringToInteger(a) + Utility::stringToInteger(b)
        + Utility::stringToInteger(c) + Utility::stringToInteger(d);
Run Code Online (Sandbox Code Playgroud)

要么:

int x = Utility::stringToInteger(a);
x += Utility::stringToInteger(b);
x += Utility::stringToInteger(c);
x += Utility::stringToInteger(d);
Run Code Online (Sandbox Code Playgroud)

澄清2:编辑宏

我使用Emacs作为我的首选IDE和Kinesis键盘,因此你知道我使用了大量的键盘宏,自定义键盘快捷键,以及实际修改我在编辑器中看到的内容与实际存储在h/cpp文件中的内容.但是,我觉得在一些选择的情况下使用函数缩写的简单性和视觉可读性(如上所述)确实是我正在寻找的结果(这肯定受到一定程度的影响).

Naw*_*waz 13

您可以编写inline将调用转发给实际函数的函数,而不是宏:

inline double ldn(double x)
{
   return Utility::longDescriptiveName(x);
}
Run Code Online (Sandbox Code Playgroud)

这当然比宏观更安全.

  • +1绝对内联函数更安全,因为类型检查,我认为建议使用(C++风格)而不是#define(C风格和不太安全).除了注意:与Macros内联不同,缺少使用任何数据类型,这是通过使用内联模板完成的! (2认同)

0x4*_*2D2 7

您可以使用函数引用:

double (&ldn)(double) = Utility::longDescriptiveName;
Run Code Online (Sandbox Code Playgroud)

  • 在C++ 11中,`auto && ldn = Utility :: longDescriptiveName;`这是非常惯用的.无论如何,`static`有什么优势? (3认同)
  • 使用函数引用可能会影响函数调用的内联能力. (2认同)