在可变参数模板参数上调用函数
在 C 中,人们可能希望设计一个可以在任意数量的参数上无缝运行的函数各种类型的参数。虽然递归模板专门化允许此类功能,但它会产生大量冗余代码。为了解决这个问题,我们寻求一种更有效的方法。
C 17 折叠表达式解决方案
在 C 17 中,折叠表达式提供了一个简单的解决方案:
(f(args), ...);
此表达式有助于在 args 变量包中的每个参数上顺序调用 f。但是,如果 f 返回带有重载逗号运算符的对象,则应使用以下语法:
((void)f(args), ...);
C 17 之前的解决方案
C 17 之前,一种典型的方法涉及使用具有故意非 void 返回类型的列表初始值设定项:
{ print(Args)... }
但是,这需要将表达式包装在未使用的变量中,以防止由于 print 的 void 返回类型而导致编译错误:
using expand_type = int[]; expand_type{ (print(Args), 0)... };
为了增强此模式的可重用性,可以定义一个宏:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... } SO_EXPAND_SIDE_EFFECTS(print(Args));
为了减轻大数组的潜在分配,可以使用自定义结构:
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
以上是如何在 C 中调用可变模板参数上的函数?的详细内容。更多信息请关注PHP中文网其他相关文章!