Print spaces between each element using a fold expression

后端 未结 4 1240
猫巷女王i
猫巷女王i 2021-01-21 05:20

I am using a fold expression to print elements in a variadic pack, but how do I get a space in between each element?

Currently the output is \"1 234\", the desired outpu

相关标签:
4条回答
  • 2021-01-21 05:41

    In general, you use recursion for tasks like this.

    You have to define what happens when there are 2 or more and 1 elements in the list and recursively fall back to those definitions:

    template <int ...> struct List;
    template <int First, int Second, int ... More> struct List {
        static void print() {
            std::cout << First << " ";
            List<Second, More ...>::print();
        }
    };
    template <int Last> struct List {
        static void print() {
            std::cout << Last;
        }
    };
    
    0 讨论(0)
  • 2021-01-21 05:44

    you can that

    #include <iostream>
    
    template<typename T>
    struct Facility
    {
    template<T head,T ... list>
    struct List
    {
        static void print()
        {
         std::cout<<"\"" << head;
         ((std::cout << " " << list), ...);
          std::cout<<"\"";
        }
    };
    };
    
    template<int ... intlist>
    using IntList = typename Facility<int>::List<intlist...>;
    int main()
    {
     using List1 = IntList<1,2,3,4>;
     List1::print();
    }
    

    the fold expression ((std::cout << " " << list), ...) will expands to ((std::cout << " " << list1), (std::cout << " " << list2), (std::cout << " " << list3)...)

    0 讨论(0)
  • 2021-01-21 05:45

    If you need space only between numbers (and not after the last or before the first too), you might do:

    template <std::size_t ... Is>
    void print_seq(std::index_sequence<Is...>)
    {
        const char* sep = "";
        (((std::cout << sep << Is), sep = " "), ...);
    }
    

    Demo

    0 讨论(0)
  • 2021-01-21 05:55

    You can reuse print() to achieve this behaviour. Afterall you are doing a fold operation which is by definition resursive.

    Live Demo

    template<T head,T ... rest_of_pack>
    
    struct List<head , rest_of_pack...>
    {
        static void print_()
        {
         std::cout<<head<<" ";
         List<rest_of_pack...>::print();
    
        }
    };
    

    If you want to process many elements this way you might run into problems with template depth (gcc for instance has a limit of 900). Lucky for you you can use the -ftemplate-depth= option to tweak this behaviour.

    You can compile with -ftemplate-depth=100000 and make it work. Note that compilation time will skyrocket (most likely) or in thhe worst case you run out of memory.

    0 讨论(0)
提交回复
热议问题