当对象是变量模板参数时如何调用成员函数?这是一个例子:
template <typename ...A>
void f(A... args)
{
args->memfunc("examples")...; // the code not right!
}
如何正确做到?
答案 0 :(得分:3)
在C ++ 17中,您可以使用fold expression:
template <typename ...A>
void f(A... args)
{
(..., args->memfunc("examples")); // the code not right!
}
答案 1 :(得分:3)
这相当棘手。参数包只能在某些上下文中扩展。你不能只写一个扩展它的语句(没有C ++ 17倍表达式)。通常的技巧涉及使用虚拟数组初始化器(这是一个可能具有良好定义的评估顺序的上下文):
int dummy[] = { // Expand it in the initializer
(void(args->memfunc("examples")), 0)...
};
我们不想强制所有成员使用特定的退货类型。因此,我们使用逗号运算符(..., 0)
来创建始终具有int
类型的表达式。但是,由于运算符可以重载,我们需要将函数调用的结果转换为void,以确保我们使用内置函数。因此,我们扩展的表达最终成为您所看到的。