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&lt;&lt;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&amp;autoauto&amp;&amp;auto const&amp;

或者您可以使用 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”宏的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

忽略函数名称定义宏的参数

是否存在使用编译器指令宏的 itoa 替代方案

c++ 中 MFC 函数的替代方案?

C++ 宏的可选参数

第一篇:尽量多的以 const/enum/inline 替代 #define

C++中 #ifdef的妙用详解