我有一个模板函数和 varargs模板参数,像这样
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) );
}
最佳答案
这是专用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/8和clang一起使用,并且可能符合标准-唯一困难的部分是
revert<Tn...>::apply(tn..., t, un...)
的调用。但是,它有缺点(如递归经常使用的那样),它会生成许多目标函数的模板实例(代码膨胀),并且没有使用完美的转发,这可能是个问题(但使用它可能会有所改进) 。
关于c++ - 如何反转可变参数模板函数的参数顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60002805/