C++ 中函数别名的“#define”宏的替代方案
Posted
技术标签:
【中文标题】C++ 中函数别名的“#define”宏的替代方案【英文标题】:Alternative to `#define` macro for function alias in C++ 【发布时间】:2020-12-11 06:54:46 【问题描述】: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? 首选using fmt::format
。
hmmmmm,您能否提供一个minimal reproducible example,以便更轻松地演示您的问题的解决方案?
是的:不要使用宏或其他方式给事物起简短的神秘名称。请改用长描述性名称。长名字是你的朋友。
【参考方案1】:
您可以使用更短的名称(在您自己的代码中)定义相同的函数。这个函数被命名为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
【讨论】:
请edit 回答您的问题,解释其工作原理以及为什么它是问题中描述的问题的解决方案。见How to Answer。 抱歉,在投票之前必须先提出这个问题,因为我不喜欢纯代码的答案......但是有解释我确实打算投票,因为学到了一些东西的乐趣(在完全在公共场合错了.... ;-) ).【参考方案2】:如果你想从命名空间引入一个符号,你可以使用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();
【讨论】:
以上是关于C++ 中函数别名的“#define”宏的替代方案的主要内容,如果未能解决你的问题,请参考以下文章