使用计数器展开参数包

时间:2014-08-02 03:42:37

标签: c++ function c++11 parameter-passing variadic-templates

我想将一个参数包扩展为函数调用,如下所示:

func(get_value(arg)...);

其中func和get_value是两个函数。问题是get_value对评估顺序很敏感,所以我认为一个解决方案是生成这样的东西:

func(get_value(arg0, 0), get_value(arg1, 1), get_value(arg2, 2));

例如,如果有三个参数。通过此计数器,我将了解评估顺序。这有办法吗?

或者作为另一种解决方案,有没有办法简单地用args指定那些调用get_value的评估顺序? (如果是这样,我甚至不需要柜台。)

1 个答案:

答案 0 :(得分:4)

你可以" zip"参数包在一起。所以,使用here中的seq定义:

template <typename ... Args, int ... N>
void F(Args... args, seq<N...>)
{
func(get_value(args, N)...);
}

template <typename ... Args>
void FHelper(Args&&... args)
{
 F(std::forward<Args>(args)..., typename gens<sizeof...(Args)>::type ());
}

您可以致电FHelper

一个更简单的解决方案,在get_value具有固定返回类型的情况下,将更改func以将initializer_list作为输入并将其称为:

func({get_value(args)...});

这保留了调用顺序,因为初始化列表中的逗号是序列点。