繁体   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