在 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)...);
}
如果你想从命名空间中引入一个符号,你可以使用using
。
如果你想更容易地输入函数的 别名,你可以使用 auto&
或 auto
或 auto&&
或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();
}
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)...);
}
如果你想从命名空间中引入一个符号,你可以使用using
。
如果你想更容易地输入函数的 别名,你可以使用 auto&
或 auto
或 auto&&
或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();
}