0

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 中是否有替代使用宏的替代方法,最好是不会影响性能的?

4

2 回答 2

3

您可以使用较短的名称定义相同的函数(在您自己的代码中)。该函数被命名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)...);
}

演示

于 2020-12-11T07:09:00.150 回答
0

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

如果您想让函数的别名更容易键入,您可以使用auto&orautoauto&&or 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();
}
于 2020-12-11T12:26:55.413 回答