c++ 如何反转可变模板函数的参数顺序?

我有一个模板函数与varargs模板参数,像这样

template<typename Args...>
void ascendingPrint(Args... args) { /* ... */ }

我想写

template<typename Args...>
void descendingPrint(Args... args) {
  /* implementation using ascendingPrint()? */
}

如何在传递参数包参数之前颠倒参数包参数的顺序,即在伪代码中:

template<typename Args...>
void descendingPrint(Args... args) {
  ascendingPrint( reverse(args) );
}
这里是一个专门的回复<>的递归实现:

// forward decl
template<class ...Tn>
struct revert;

// recursion anchor
template<>
struct revert<>
{
    template<class ...Un>
    static void apply(Un const&... un)
    {
        ascendingPrint(un...);
    }
};

// recursion
template<class T, class ...Tn>
struct revert<T, Tn...> 
{
    template<class ...Un>
    static void apply(T const& t, Tn const&... tn, Un const&... un)
    {
        // bubble 1st parameter backwards
        revert<Tn...>::apply(tn..., t, un...);
    }
};

// using recursive function
template<class A, class ...An>
void descendingPrint(A const& a, An const&... an)
{
    revert<An...>::apply(an..., a);
}

它适用于gcc-4.6 / 7/8和clang,可能是标准兼容 – 唯一困难的部分是回复调用< Tn ...> :: apply(tn …,t,un … )。

它有缺点虽然(作为递归经常),它生成目标函数(代码膨胀)的许多模板实例化,并不使用完美的转发,这可能是一个问题(但也许可以改进使用它) 。

http://stackoverflow.com/questions/15904288/how-to-reverse-the-order-of-arguments-of-a-variadic-template-function

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c++ 如何反转可变模板函数的参数顺序?