在 C++ 中替代 `#define` 宏作为函数别名

Alternative to `#define` macro for function alias in C++

fmtlib 的函数如下:

template <typename S, typename... Args, typename Char = char_t<S>>
inline std::basic_string<Char> format(const S& format_str, Args&&... args) {
  return internal::vformat(
      to_string_view(format_str),
      {internal::make_args_checked<Args...>(format_str, args...)});
}

为了方便起见,我定义了一个宏,例如:

#define FMT fmt::format

我这样使用它:

std::cout<<FMT("Name: {0}\n", "Joe");

在 C++11 中是否有替代方法来使用宏,最好是不影响性能的方法?

您可以用更短的名称定义相同的函数(在您自己的代码中)。此函数名为 FMT() 并将其参数传递给 fmt::format(),这是您要调用的原始函数:

template <typename S, typename... Args, typename Char = fmt::char_t<S>>
inline std::basic_string<Char> FMT(const S& format_str, Args&&... args) {
  return fmt::format(format_str, std::forward<Args>(args)...);
}

Demo

如果你想从命名空间中引入一个符号,你可以使用using

如果你想更容易地输入函数的 别名,你可以使用 auto&autoauto&&auto const&.

或者您可以使用 lamdba 包装器。

在我看来,其中任何一个都是比函数式 更好的选择。

#include <iostream>

using std::cout;

namespace Happy {

void Joy();

void Joy() {
    cout << "Joy and pride!\n";
}

} // Happy

int main() {
    // Example of using.
    using Happy::Joy;
    Joy();

    // Example of aliasing.
    auto& pride = Happy::Joy;
    auto pride2 = Happy::Joy;
    auto&& pride3 = Happy::Joy;
    auto const& pride4 = &Happy::Joy;
    pride();
    pride2();
    pride3();
    pride4();

    // Example of wrapping in a lambda.
    auto lambda = []{ Happy::Joy(); };
    lambda();
}