当对象是可变模板参数时,如何调用成员函数

how to call member functions when the objects is variable template parameters

本文关键字:何调用 调用 函数 成员 对象 参数      更新时间:2023-10-16

当对象是变量模板参数时,如何调用成员函数?这是一个例子:

template <typename ...A>
void f(A... args)
{
    args->memfunc("examples")...; // the code not right!
}

如何做对吗?

这很棘手。参数包只能在某些情况下扩展。您不能只编写扩展它的语句(没有C 17倍表达式)。通常的技巧涉及使用虚拟阵列初始化器(这是具有定义定义的评估顺序的可能上下文):

int dummy[] = { // Expand it in the initializer
  (void(args->memfunc("examples")), 0)...
};

我们不想强制所有成员的特定返回类型。因此,我们使用逗号运算符(..., 0)来创建一个始终具有int类型的表达式。但是,由于运算符可以超载,我们需要将功能调用的结果施加到void,以确保我们使用内置的函数。因此,我们扩展的表达最终是您所看到的。

在C 17中,您可以使用折叠表达式:

template <typename ...A>
void f(A... args)
{
    (..., args->memfunc("examples")); // the code not right!
}