在参数列表中评估函数时向后迭代参数包

时间:2018-12-21 00:34:31

标签: c++ c++11 variadic-templates variadic-functions

我正在学习C ++中的参数打包,对此代码段的输出感到困惑:

template<typename... Ts>
void f1(Ts... args)
{
    std::cout << "------------------------" << std::endl;
    int dummy[sizeof...(Ts)] = { (std::cout << args << std::endl, 0)... };
    std::cout << "------------------------" << std::endl;
}

template<typename Tout, typename T>
Tout f2(T arg)
{
    std::cout << arg << std::endl;
    return 2.0 * (Tout)arg;
}

template<typename... Ts>
void f3(Ts... args)
{
    f1(f2<double>(args)...);
}

int main()
{
    f1(1, 2, 3);    
    f3(1, 2, 3);
}

我的机器上的输出如下所示,突出显示了重要的行

------------------------
1
2
3
------------------------
3   <<< GOING BACKWARDS >>>
2
1
------------------------
2
4
6
------------------------

在我看来,f2<double>(args)...内的f3的求值是倒数的,但随后又倒过来执行f1。从到目前为止的阅读中,我认为可以保证参数打包是有序的,所以这非常令人惊讶。

这是一个较大项目的最小示例,在其中重要的是按顺序执行f2。有什么方法可以使它颠倒顺序,或者至少可以保证我总是使它向后退?

0 个答案:

没有答案