How to reverse the order of arguments of a variadic template function?

前端 未结 5 1162
猫巷女王i
猫巷女王i 2020-11-27 16:42

I have a template function with varargs template arguments, like this

template
void ascendingPrint(         


        
5条回答
  •  甜味超标
    2020-11-27 17:37

    My solution supports perfect forwarding and does not involve a recursion:

    #include 
    #include 
    #include 
    
    #include 
    
    template< typename ...types >
    void
    ascendingPrint(types &&... _values)
    {
        (std::cout << ... << std::forward< types >(_values)) << std::endl;
    }
    
    template< typename ...types, std::size_t ...indices >
    void
    descendingPrintHelper(std::tuple< types... > const & refs, std::index_sequence< indices... >)
    {
        constexpr std::size_t back_index = sizeof...(indices) - 1;
        return ascendingPrint(std::forward< std::tuple_element_t< back_index - indices, std::tuple< types... > > >(std::get< back_index - indices >(refs))...);
    }
    
    template< typename ...types >
    void
    descendingPrint(types &&... _values)
    {
        auto const refs = std::forward_as_tuple(std::forward< types >(_values)...);
        return descendingPrintHelper(refs, std::make_index_sequence< sizeof...(types) >{});
    }
    
    int
    main()
    {
        ascendingPrint(1, ' ', 2, ' ', 3);
        descendingPrint(1, ' ', 2, ' ', 3);
        return EXIT_SUCCESS;
    }
    

    Live example (or even simplier).

    Also modern compilers can perfectly optimize out all the unnecessary stuff: https://godbolt.org/g/01Qf6w

提交回复
热议问题