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

时间:2017-09-04 06:39:31

标签: c++ templates

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

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

如何正确做到?

2 个答案:

答案 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,以确保我们使用内置函数。因此,我们扩展的表达最终成为您所看到的。