How to unroll a parameter pack from right to left Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!C++ template partial specialization: Why cant I match the last type in variadic-template?Partial template specialization with multiple template parameter packsWhy won't template parameter pack be deduced to multiple type arguments in function call?Clang vs GCC - Variadic template parameter pack followed by parameter with default value works in GCC 4.8 but not Clang 3.5Generating template specializations through template metaprogramming. Odd compiler behaviourHow to access first parameter in parameter pack?Can outer parameter pack be expanded with inner parameter pack to be deduced?Size of parameter pack in template specializationC++ template partial specialization: Why cant I match the last type in variadic-template?variadic vs non variadic function template overloading partial orderingFunction template overload resolution with two parameter packs

Putting class ranking in CV, but against dept guidelines

Why are vacuum tubes still used in amateur radios?

Would it be possible to dictate a bech32 address as a list of English words?

Crossing US/Canada Border for less than 24 hours

What is Adi Shankara referring to when he says "He has Vajra marks on his feet"?

Product of Mrówka space and one point compactification discrete space.

How does light 'choose' between wave and particle behaviour?

Generate an RGB colour grid

Do I really need to have a message in a novel to appeal to readers?

How do I find out the mythology and history of my Fortress?

Why does it sometimes sound good to play a grace note as a lead in to a note in a melody?

What's the meaning of "fortified infraction restraint"?

Why weren't discrete x86 CPUs ever used in game hardware?

Hangman Game with C++

What would you call this weird metallic apparatus that allows you to lift people?

How could we fake a moon landing now?

Is it possible for SQL statements to execute concurrently within a single session in SQL Server?

Would it be easier to apply for a UK visa if there is a host family to sponsor for you in going there?

How to unroll a parameter pack from right to left

Significance of Cersei's obsession with elephants?

AppleTVs create a chatty alternate WiFi network

Strange behavior of Object.defineProperty() in JavaScript

Should there be a hyphen in the construction "IT affin"?

What is the appropriate index architecture when forced to implement IsDeleted (soft deletes)?



How to unroll a parameter pack from right to left



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!C++ template partial specialization: Why cant I match the last type in variadic-template?Partial template specialization with multiple template parameter packsWhy won't template parameter pack be deduced to multiple type arguments in function call?Clang vs GCC - Variadic template parameter pack followed by parameter with default value works in GCC 4.8 but not Clang 3.5Generating template specializations through template metaprogramming. Odd compiler behaviourHow to access first parameter in parameter pack?Can outer parameter pack be expanded with inner parameter pack to be deduced?Size of parameter pack in template specializationC++ template partial specialization: Why cant I match the last type in variadic-template?variadic vs non variadic function template overloading partial orderingFunction template overload resolution with two parameter packs



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








7















I am trying to do a parameter pack unrolling by dispatching to a class recursively. I'd like to do that from right to left since some of the operations do pre-pending.



template <typename... T>
class Foo;

template <typename T>
class Foo<T> /* base case implementation*/;

template <typename T, typename R, typename... Rs>
class Foo<T, Rs..., R>
private:
Foo<T, Rs...> foo_;



Unfortunately, the above gets me:



class template partial specialization contains template parameters that cannot be deduced;
this partial specialization will never be used


This seems odd to me, I would assume that even though the arguments has switched order, Foo<T, Rs..., R> should still match the template specialization.



I've looked at some similar questions:



Specifically, C++ template partial specialization: Why cant I match the last type in variadic-template?



However, the highest voted (non-accepted) answer doesn't make sense to me. Sure I understand that the template parameter pack declaration must be the last in the declaration, but I do that for the template specialization.



I'm not sure why the compiler cannot map Foo<T, Rs..., R> to the initial template declaration Foo<T...> and enforces the parameter pack declaration order there.



Other answers on that thread offer how to extract the last value, but that still doesn't allow you to do recursive parameter pack unrolling, which is sort of the whole point here. Is it just impossible to unroll a parameter pack from right to left?










share|improve this question



















  • 2





    Well you can revert the order of the argument then unroll left to right. You may look an implementation of revert here : bitbucket.org/MartinMorterol/glp/src/dev/include/… or here github.com/edouarda/brigand/blob/master/include/brigand/…

    – Martin Morterol
    58 mins ago












  • What compiler are you using? I get a more helpful error message with the latest gcc: wandbox.org/permlink/BF2aCVw62TrdkrGz

    – Paul Sanders
    54 mins ago











  • I can't fix it (edit must be 6 chars long...), but you have trivial error in your code example - 4 dots in first line of parameter pack declaration instead of 3

    – Michał Łoś
    42 mins ago

















7















I am trying to do a parameter pack unrolling by dispatching to a class recursively. I'd like to do that from right to left since some of the operations do pre-pending.



template <typename... T>
class Foo;

template <typename T>
class Foo<T> /* base case implementation*/;

template <typename T, typename R, typename... Rs>
class Foo<T, Rs..., R>
private:
Foo<T, Rs...> foo_;



Unfortunately, the above gets me:



class template partial specialization contains template parameters that cannot be deduced;
this partial specialization will never be used


This seems odd to me, I would assume that even though the arguments has switched order, Foo<T, Rs..., R> should still match the template specialization.



I've looked at some similar questions:



Specifically, C++ template partial specialization: Why cant I match the last type in variadic-template?



However, the highest voted (non-accepted) answer doesn't make sense to me. Sure I understand that the template parameter pack declaration must be the last in the declaration, but I do that for the template specialization.



I'm not sure why the compiler cannot map Foo<T, Rs..., R> to the initial template declaration Foo<T...> and enforces the parameter pack declaration order there.



Other answers on that thread offer how to extract the last value, but that still doesn't allow you to do recursive parameter pack unrolling, which is sort of the whole point here. Is it just impossible to unroll a parameter pack from right to left?










share|improve this question



















  • 2





    Well you can revert the order of the argument then unroll left to right. You may look an implementation of revert here : bitbucket.org/MartinMorterol/glp/src/dev/include/… or here github.com/edouarda/brigand/blob/master/include/brigand/…

    – Martin Morterol
    58 mins ago












  • What compiler are you using? I get a more helpful error message with the latest gcc: wandbox.org/permlink/BF2aCVw62TrdkrGz

    – Paul Sanders
    54 mins ago











  • I can't fix it (edit must be 6 chars long...), but you have trivial error in your code example - 4 dots in first line of parameter pack declaration instead of 3

    – Michał Łoś
    42 mins ago













7












7








7


3






I am trying to do a parameter pack unrolling by dispatching to a class recursively. I'd like to do that from right to left since some of the operations do pre-pending.



template <typename... T>
class Foo;

template <typename T>
class Foo<T> /* base case implementation*/;

template <typename T, typename R, typename... Rs>
class Foo<T, Rs..., R>
private:
Foo<T, Rs...> foo_;



Unfortunately, the above gets me:



class template partial specialization contains template parameters that cannot be deduced;
this partial specialization will never be used


This seems odd to me, I would assume that even though the arguments has switched order, Foo<T, Rs..., R> should still match the template specialization.



I've looked at some similar questions:



Specifically, C++ template partial specialization: Why cant I match the last type in variadic-template?



However, the highest voted (non-accepted) answer doesn't make sense to me. Sure I understand that the template parameter pack declaration must be the last in the declaration, but I do that for the template specialization.



I'm not sure why the compiler cannot map Foo<T, Rs..., R> to the initial template declaration Foo<T...> and enforces the parameter pack declaration order there.



Other answers on that thread offer how to extract the last value, but that still doesn't allow you to do recursive parameter pack unrolling, which is sort of the whole point here. Is it just impossible to unroll a parameter pack from right to left?










share|improve this question
















I am trying to do a parameter pack unrolling by dispatching to a class recursively. I'd like to do that from right to left since some of the operations do pre-pending.



template <typename... T>
class Foo;

template <typename T>
class Foo<T> /* base case implementation*/;

template <typename T, typename R, typename... Rs>
class Foo<T, Rs..., R>
private:
Foo<T, Rs...> foo_;



Unfortunately, the above gets me:



class template partial specialization contains template parameters that cannot be deduced;
this partial specialization will never be used


This seems odd to me, I would assume that even though the arguments has switched order, Foo<T, Rs..., R> should still match the template specialization.



I've looked at some similar questions:



Specifically, C++ template partial specialization: Why cant I match the last type in variadic-template?



However, the highest voted (non-accepted) answer doesn't make sense to me. Sure I understand that the template parameter pack declaration must be the last in the declaration, but I do that for the template specialization.



I'm not sure why the compiler cannot map Foo<T, Rs..., R> to the initial template declaration Foo<T...> and enforces the parameter pack declaration order there.



Other answers on that thread offer how to extract the last value, but that still doesn't allow you to do recursive parameter pack unrolling, which is sort of the whole point here. Is it just impossible to unroll a parameter pack from right to left?







c++ c++11






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 27 mins ago









Bob__

5,26331527




5,26331527










asked 1 hour ago









IdeaHatIdeaHat

5,7381340




5,7381340







  • 2





    Well you can revert the order of the argument then unroll left to right. You may look an implementation of revert here : bitbucket.org/MartinMorterol/glp/src/dev/include/… or here github.com/edouarda/brigand/blob/master/include/brigand/…

    – Martin Morterol
    58 mins ago












  • What compiler are you using? I get a more helpful error message with the latest gcc: wandbox.org/permlink/BF2aCVw62TrdkrGz

    – Paul Sanders
    54 mins ago











  • I can't fix it (edit must be 6 chars long...), but you have trivial error in your code example - 4 dots in first line of parameter pack declaration instead of 3

    – Michał Łoś
    42 mins ago












  • 2





    Well you can revert the order of the argument then unroll left to right. You may look an implementation of revert here : bitbucket.org/MartinMorterol/glp/src/dev/include/… or here github.com/edouarda/brigand/blob/master/include/brigand/…

    – Martin Morterol
    58 mins ago












  • What compiler are you using? I get a more helpful error message with the latest gcc: wandbox.org/permlink/BF2aCVw62TrdkrGz

    – Paul Sanders
    54 mins ago











  • I can't fix it (edit must be 6 chars long...), but you have trivial error in your code example - 4 dots in first line of parameter pack declaration instead of 3

    – Michał Łoś
    42 mins ago







2




2





Well you can revert the order of the argument then unroll left to right. You may look an implementation of revert here : bitbucket.org/MartinMorterol/glp/src/dev/include/… or here github.com/edouarda/brigand/blob/master/include/brigand/…

– Martin Morterol
58 mins ago






Well you can revert the order of the argument then unroll left to right. You may look an implementation of revert here : bitbucket.org/MartinMorterol/glp/src/dev/include/… or here github.com/edouarda/brigand/blob/master/include/brigand/…

– Martin Morterol
58 mins ago














What compiler are you using? I get a more helpful error message with the latest gcc: wandbox.org/permlink/BF2aCVw62TrdkrGz

– Paul Sanders
54 mins ago





What compiler are you using? I get a more helpful error message with the latest gcc: wandbox.org/permlink/BF2aCVw62TrdkrGz

– Paul Sanders
54 mins ago













I can't fix it (edit must be 6 chars long...), but you have trivial error in your code example - 4 dots in first line of parameter pack declaration instead of 3

– Michał Łoś
42 mins ago





I can't fix it (edit must be 6 chars long...), but you have trivial error in your code example - 4 dots in first line of parameter pack declaration instead of 3

– Michał Łoś
42 mins ago












2 Answers
2






active

oldest

votes


















4














Here is an utility to instatiate a template with a reverse order of template parameters:



#include <type_traits>
#include <tuple>

template <template <typename...> typename Template, typename ...Arg>
struct RevertHelper;

template <template <typename > typename Template, typename Arg>
struct RevertHelper<Template, Arg>

using Result = Template<Arg>;
;

template <template <typename... > typename Template, typename Head, typename ...Tail>
struct RevertHelper<Template, Head, Tail...>

private:
template <typename ...XArgs>
using BindToTail = Template<XArgs..., Head>;

public:

using Result = typename RevertHelper<BindToTail, Tail...>::Result;
;

static_assert(std::is_same_v<typename RevertHelper<std::tuple, int, double>::Result, std::tuple<double, int>>, "");


So if you need to instantiate Foo with template pack Args... being reversed you can use



typename RevertHelper<Foo, Args...>::Result


To do the parameter pack expansion the way you want, dispatch to the reversed implementation:



namespace internal 
template <typename... T>
class FooHelper;
template <typename T>
class FooHelper<T> /* base implementation */
template <typename L, typename R, typename... Rs>
class FooHelper<T>
private:
Foo<T, Rs...> foo_helper_;
;

template <typename... T>
class Foo
typename RevertHelper<internal::FooHelper, T...>::Result foo_helper_;
;





share|improve this answer

























  • So the idea is that the actually usable class inverses the order and then dispatches to a class that reverses the order, and do the unpacking in that helper class?

    – IdeaHat
    29 mins ago











  • "thanks i hate it" :-) . Added the code example. So much boilerplate to do something so simple.

    – IdeaHat
    19 mins ago











  • @IdeaHat, yes I meant something like that. You can even make "Foo" a template alias to a RevertHelper<internal::FooHelper, T...>

    – Dmitry Gordon
    17 mins ago


















2














Pattern matching in C++ template patterns is intentionally simplified for sake of simplicity of algorithm and understanding.



Take a look at hypothetical algorithm if this could be possible:



  1. Get some declaration: using X = Foo<int, char, bool, double>;

  2. Compiler checks specializations: first one is Foo - it's dropped.

  3. Compiler checks specializations: second one is your Foo<T, Rs..., R>


    1. T is int, we're fine.


    2. R's can be emtpy, let's try to skip it.


    3. R is char, but we're at the end of specialization parameters, let's get back to 2.


    4. R's is char


    5. R is bool, but we're at the end of specialization parameters, let's get back to 2.


    6. R's is char, bool


    7. R is double, we're fine, select this one


But this is only one scenario: another one would be to eat all parameters to the end and cut off one by one in order to try to match it. This can be problematic, because such template specialization would be inherently ambiguous with another possible specialization that doesn't seem to be an ambiguity here:



template<typename T, typename S>
class Foo<T, S> ;





share|improve this answer

























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55762106%2fhow-to-unroll-a-parameter-pack-from-right-to-left%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    4














    Here is an utility to instatiate a template with a reverse order of template parameters:



    #include <type_traits>
    #include <tuple>

    template <template <typename...> typename Template, typename ...Arg>
    struct RevertHelper;

    template <template <typename > typename Template, typename Arg>
    struct RevertHelper<Template, Arg>

    using Result = Template<Arg>;
    ;

    template <template <typename... > typename Template, typename Head, typename ...Tail>
    struct RevertHelper<Template, Head, Tail...>

    private:
    template <typename ...XArgs>
    using BindToTail = Template<XArgs..., Head>;

    public:

    using Result = typename RevertHelper<BindToTail, Tail...>::Result;
    ;

    static_assert(std::is_same_v<typename RevertHelper<std::tuple, int, double>::Result, std::tuple<double, int>>, "");


    So if you need to instantiate Foo with template pack Args... being reversed you can use



    typename RevertHelper<Foo, Args...>::Result


    To do the parameter pack expansion the way you want, dispatch to the reversed implementation:



    namespace internal 
    template <typename... T>
    class FooHelper;
    template <typename T>
    class FooHelper<T> /* base implementation */
    template <typename L, typename R, typename... Rs>
    class FooHelper<T>
    private:
    Foo<T, Rs...> foo_helper_;
    ;

    template <typename... T>
    class Foo
    typename RevertHelper<internal::FooHelper, T...>::Result foo_helper_;
    ;





    share|improve this answer

























    • So the idea is that the actually usable class inverses the order and then dispatches to a class that reverses the order, and do the unpacking in that helper class?

      – IdeaHat
      29 mins ago











    • "thanks i hate it" :-) . Added the code example. So much boilerplate to do something so simple.

      – IdeaHat
      19 mins ago











    • @IdeaHat, yes I meant something like that. You can even make "Foo" a template alias to a RevertHelper<internal::FooHelper, T...>

      – Dmitry Gordon
      17 mins ago















    4














    Here is an utility to instatiate a template with a reverse order of template parameters:



    #include <type_traits>
    #include <tuple>

    template <template <typename...> typename Template, typename ...Arg>
    struct RevertHelper;

    template <template <typename > typename Template, typename Arg>
    struct RevertHelper<Template, Arg>

    using Result = Template<Arg>;
    ;

    template <template <typename... > typename Template, typename Head, typename ...Tail>
    struct RevertHelper<Template, Head, Tail...>

    private:
    template <typename ...XArgs>
    using BindToTail = Template<XArgs..., Head>;

    public:

    using Result = typename RevertHelper<BindToTail, Tail...>::Result;
    ;

    static_assert(std::is_same_v<typename RevertHelper<std::tuple, int, double>::Result, std::tuple<double, int>>, "");


    So if you need to instantiate Foo with template pack Args... being reversed you can use



    typename RevertHelper<Foo, Args...>::Result


    To do the parameter pack expansion the way you want, dispatch to the reversed implementation:



    namespace internal 
    template <typename... T>
    class FooHelper;
    template <typename T>
    class FooHelper<T> /* base implementation */
    template <typename L, typename R, typename... Rs>
    class FooHelper<T>
    private:
    Foo<T, Rs...> foo_helper_;
    ;

    template <typename... T>
    class Foo
    typename RevertHelper<internal::FooHelper, T...>::Result foo_helper_;
    ;





    share|improve this answer

























    • So the idea is that the actually usable class inverses the order and then dispatches to a class that reverses the order, and do the unpacking in that helper class?

      – IdeaHat
      29 mins ago











    • "thanks i hate it" :-) . Added the code example. So much boilerplate to do something so simple.

      – IdeaHat
      19 mins ago











    • @IdeaHat, yes I meant something like that. You can even make "Foo" a template alias to a RevertHelper<internal::FooHelper, T...>

      – Dmitry Gordon
      17 mins ago













    4












    4








    4







    Here is an utility to instatiate a template with a reverse order of template parameters:



    #include <type_traits>
    #include <tuple>

    template <template <typename...> typename Template, typename ...Arg>
    struct RevertHelper;

    template <template <typename > typename Template, typename Arg>
    struct RevertHelper<Template, Arg>

    using Result = Template<Arg>;
    ;

    template <template <typename... > typename Template, typename Head, typename ...Tail>
    struct RevertHelper<Template, Head, Tail...>

    private:
    template <typename ...XArgs>
    using BindToTail = Template<XArgs..., Head>;

    public:

    using Result = typename RevertHelper<BindToTail, Tail...>::Result;
    ;

    static_assert(std::is_same_v<typename RevertHelper<std::tuple, int, double>::Result, std::tuple<double, int>>, "");


    So if you need to instantiate Foo with template pack Args... being reversed you can use



    typename RevertHelper<Foo, Args...>::Result


    To do the parameter pack expansion the way you want, dispatch to the reversed implementation:



    namespace internal 
    template <typename... T>
    class FooHelper;
    template <typename T>
    class FooHelper<T> /* base implementation */
    template <typename L, typename R, typename... Rs>
    class FooHelper<T>
    private:
    Foo<T, Rs...> foo_helper_;
    ;

    template <typename... T>
    class Foo
    typename RevertHelper<internal::FooHelper, T...>::Result foo_helper_;
    ;





    share|improve this answer















    Here is an utility to instatiate a template with a reverse order of template parameters:



    #include <type_traits>
    #include <tuple>

    template <template <typename...> typename Template, typename ...Arg>
    struct RevertHelper;

    template <template <typename > typename Template, typename Arg>
    struct RevertHelper<Template, Arg>

    using Result = Template<Arg>;
    ;

    template <template <typename... > typename Template, typename Head, typename ...Tail>
    struct RevertHelper<Template, Head, Tail...>

    private:
    template <typename ...XArgs>
    using BindToTail = Template<XArgs..., Head>;

    public:

    using Result = typename RevertHelper<BindToTail, Tail...>::Result;
    ;

    static_assert(std::is_same_v<typename RevertHelper<std::tuple, int, double>::Result, std::tuple<double, int>>, "");


    So if you need to instantiate Foo with template pack Args... being reversed you can use



    typename RevertHelper<Foo, Args...>::Result


    To do the parameter pack expansion the way you want, dispatch to the reversed implementation:



    namespace internal 
    template <typename... T>
    class FooHelper;
    template <typename T>
    class FooHelper<T> /* base implementation */
    template <typename L, typename R, typename... Rs>
    class FooHelper<T>
    private:
    Foo<T, Rs...> foo_helper_;
    ;

    template <typename... T>
    class Foo
    typename RevertHelper<internal::FooHelper, T...>::Result foo_helper_;
    ;






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 21 mins ago









    IdeaHat

    5,7381340




    5,7381340










    answered 46 mins ago









    Dmitry GordonDmitry Gordon

    1,089614




    1,089614












    • So the idea is that the actually usable class inverses the order and then dispatches to a class that reverses the order, and do the unpacking in that helper class?

      – IdeaHat
      29 mins ago











    • "thanks i hate it" :-) . Added the code example. So much boilerplate to do something so simple.

      – IdeaHat
      19 mins ago











    • @IdeaHat, yes I meant something like that. You can even make "Foo" a template alias to a RevertHelper<internal::FooHelper, T...>

      – Dmitry Gordon
      17 mins ago

















    • So the idea is that the actually usable class inverses the order and then dispatches to a class that reverses the order, and do the unpacking in that helper class?

      – IdeaHat
      29 mins ago











    • "thanks i hate it" :-) . Added the code example. So much boilerplate to do something so simple.

      – IdeaHat
      19 mins ago











    • @IdeaHat, yes I meant something like that. You can even make "Foo" a template alias to a RevertHelper<internal::FooHelper, T...>

      – Dmitry Gordon
      17 mins ago
















    So the idea is that the actually usable class inverses the order and then dispatches to a class that reverses the order, and do the unpacking in that helper class?

    – IdeaHat
    29 mins ago





    So the idea is that the actually usable class inverses the order and then dispatches to a class that reverses the order, and do the unpacking in that helper class?

    – IdeaHat
    29 mins ago













    "thanks i hate it" :-) . Added the code example. So much boilerplate to do something so simple.

    – IdeaHat
    19 mins ago





    "thanks i hate it" :-) . Added the code example. So much boilerplate to do something so simple.

    – IdeaHat
    19 mins ago













    @IdeaHat, yes I meant something like that. You can even make "Foo" a template alias to a RevertHelper<internal::FooHelper, T...>

    – Dmitry Gordon
    17 mins ago





    @IdeaHat, yes I meant something like that. You can even make "Foo" a template alias to a RevertHelper<internal::FooHelper, T...>

    – Dmitry Gordon
    17 mins ago













    2














    Pattern matching in C++ template patterns is intentionally simplified for sake of simplicity of algorithm and understanding.



    Take a look at hypothetical algorithm if this could be possible:



    1. Get some declaration: using X = Foo<int, char, bool, double>;

    2. Compiler checks specializations: first one is Foo - it's dropped.

    3. Compiler checks specializations: second one is your Foo<T, Rs..., R>


      1. T is int, we're fine.


      2. R's can be emtpy, let's try to skip it.


      3. R is char, but we're at the end of specialization parameters, let's get back to 2.


      4. R's is char


      5. R is bool, but we're at the end of specialization parameters, let's get back to 2.


      6. R's is char, bool


      7. R is double, we're fine, select this one


    But this is only one scenario: another one would be to eat all parameters to the end and cut off one by one in order to try to match it. This can be problematic, because such template specialization would be inherently ambiguous with another possible specialization that doesn't seem to be an ambiguity here:



    template<typename T, typename S>
    class Foo<T, S> ;





    share|improve this answer





























      2














      Pattern matching in C++ template patterns is intentionally simplified for sake of simplicity of algorithm and understanding.



      Take a look at hypothetical algorithm if this could be possible:



      1. Get some declaration: using X = Foo<int, char, bool, double>;

      2. Compiler checks specializations: first one is Foo - it's dropped.

      3. Compiler checks specializations: second one is your Foo<T, Rs..., R>


        1. T is int, we're fine.


        2. R's can be emtpy, let's try to skip it.


        3. R is char, but we're at the end of specialization parameters, let's get back to 2.


        4. R's is char


        5. R is bool, but we're at the end of specialization parameters, let's get back to 2.


        6. R's is char, bool


        7. R is double, we're fine, select this one


      But this is only one scenario: another one would be to eat all parameters to the end and cut off one by one in order to try to match it. This can be problematic, because such template specialization would be inherently ambiguous with another possible specialization that doesn't seem to be an ambiguity here:



      template<typename T, typename S>
      class Foo<T, S> ;





      share|improve this answer



























        2












        2








        2







        Pattern matching in C++ template patterns is intentionally simplified for sake of simplicity of algorithm and understanding.



        Take a look at hypothetical algorithm if this could be possible:



        1. Get some declaration: using X = Foo<int, char, bool, double>;

        2. Compiler checks specializations: first one is Foo - it's dropped.

        3. Compiler checks specializations: second one is your Foo<T, Rs..., R>


          1. T is int, we're fine.


          2. R's can be emtpy, let's try to skip it.


          3. R is char, but we're at the end of specialization parameters, let's get back to 2.


          4. R's is char


          5. R is bool, but we're at the end of specialization parameters, let's get back to 2.


          6. R's is char, bool


          7. R is double, we're fine, select this one


        But this is only one scenario: another one would be to eat all parameters to the end and cut off one by one in order to try to match it. This can be problematic, because such template specialization would be inherently ambiguous with another possible specialization that doesn't seem to be an ambiguity here:



        template<typename T, typename S>
        class Foo<T, S> ;





        share|improve this answer















        Pattern matching in C++ template patterns is intentionally simplified for sake of simplicity of algorithm and understanding.



        Take a look at hypothetical algorithm if this could be possible:



        1. Get some declaration: using X = Foo<int, char, bool, double>;

        2. Compiler checks specializations: first one is Foo - it's dropped.

        3. Compiler checks specializations: second one is your Foo<T, Rs..., R>


          1. T is int, we're fine.


          2. R's can be emtpy, let's try to skip it.


          3. R is char, but we're at the end of specialization parameters, let's get back to 2.


          4. R's is char


          5. R is bool, but we're at the end of specialization parameters, let's get back to 2.


          6. R's is char, bool


          7. R is double, we're fine, select this one


        But this is only one scenario: another one would be to eat all parameters to the end and cut off one by one in order to try to match it. This can be problematic, because such template specialization would be inherently ambiguous with another possible specialization that doesn't seem to be an ambiguity here:



        template<typename T, typename S>
        class Foo<T, S> ;






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 31 mins ago









        Stack Danny

        2,173932




        2,173932










        answered 47 mins ago









        Michał ŁośMichał Łoś

        508312




        508312



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55762106%2fhow-to-unroll-a-parameter-pack-from-right-to-left%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Category:Fedor von Bock Media in category "Fedor von Bock"Navigation menuUpload mediaISNI: 0000 0000 5511 3417VIAF ID: 24712551GND ID: 119294796Library of Congress authority ID: n96068363BnF ID: 12534305fSUDOC authorities ID: 034604189Open Library ID: OL338253ANKCR AUT ID: jn19990000869National Library of Israel ID: 000514068National Thesaurus for Author Names ID: 341574317ReasonatorScholiaStatistics

            Reverse int within the 32-bit signed integer range: [−2^31, 2^31 − 1]Combining two 32-bit integers into one 64-bit integerDetermine if an int is within rangeLossy packing 32 bit integer to 16 bitComputing the square root of a 64-bit integerKeeping integer addition within boundsSafe multiplication of two 64-bit signed integersLeetcode 10: Regular Expression MatchingSigned integer-to-ascii x86_64 assembler macroReverse the digits of an Integer“Add two numbers given in reverse order from a linked list”

            Kiel Indholdsfortegnelse Historie | Transport og færgeforbindelser | Sejlsport og anden sport | Kultur | Kendte personer fra Kiel | Noter | Litteratur | Eksterne henvisninger | Navigationsmenuwww.kiel.de54°19′31″N 10°8′26″Ø / 54.32528°N 10.14056°Ø / 54.32528; 10.14056Oberbürgermeister Dr. Ulf Kämpferwww.statistik-nord.deDen danske Stats StatistikKiels hjemmesiderrrWorldCat312794080n790547494030481-4