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

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

我有一个模板函数 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/

相关文章:

c++ - 需要查找数组中内容的个数

c++11 - 如何使用按位运算将 3 个整数值编码为 uint16_t?

c++ - 使公共(public)成员只读

c++ - C++11 互斥量是在用户空间中实现的吗?

c++ - GTK+,如何将小部件更新到主循环中?

c++ - 如何在 gdb 中打印长字符串的完整值?

C++:使一个矩阵指向另一个矩阵

c# - 如何使用 Devexpress 获取已在 C#.Net 中创建的模板/报告?

html - 如何在 CKEditor 中创建自定义 html 模板?

c++ - 如何确定 C++ 对象是否为 time_t