温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - How to reverse the order of arguments of a variadic template function?
c++ c++11 templates variadic-templates variadic-functions

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

发布于 2020-03-31 23:12:57

我有一个带有varargs template arguments模板函数,像这样

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

我想写

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

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

template<typename Args...>
void descendingPrint(Args... args) {
  ascendingPrint( reverse(args) );
}

查看更多

提问者
towi
被浏览
56
19k 2013-04-11 16:04

这是专门递归实现revert<>

// 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/8clang一起使用,并且可能符合标准 -唯一困难的部分是的调用revert<Tn...>::apply(tn..., t, un...)

但是,它有缺点(就像递归一样),它会生成很多目标函数的模板实例(代码膨胀),并且没有使用完美的转发,这可能是个问题(但使用它可能会有所改进) 。