Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simultaneous recursion over multiple parameter packs

Tags:

c++

templates

Is it possible in C++ to simultaneously recurse over multiple (in my case two) parameter packs? How?

To give a better idea of exactly what I'm asking, I currently have a class template as follows:

template<template<typename> class C, typename... Rest>
class Inherit {};
template<template<typename> class C, typename T, typename... Rest>
class Inherit<C, T, Rest...> :
    public C<T>,
    public Inherit<C, Rest...>
{
};

I'm using this class template in another class which takes a parameter pack Ts to have that class inherit multiple times from a templated interface. For example:

template<typename T>
class Interface
{
    ...
};

template<typename... Ts>
class Example :
    public Inherit<Interface, Ts...>
{
};

Now, what I would like to do is this:

template<typename T, const char* N>
class Interface
{
    ...
};

template<typename... Ts, const char*... Ns>
class Example :
    public Inherit<Interface, Ts..., Ns...>
{
};

I need a templated Inherit class that can recurse and pick an element off of both the Ts and the Ns parameter pack at once (assuming that parameter pack Ts and Ns have the same length). I'm not versed enough in template programming to know if this is even possible?

like image 249
Nick Vanbaelen Avatar asked Oct 27 '22 10:10

Nick Vanbaelen


1 Answers

I would argue that you don't need this Inherit class template based on the examples you gave. Here's how I'd write your first example:

template<typename T>
class Interface
{
    ...
};

template<typename... Ts>
class Example : public Interface<Ts>...
{
};

and your second example:

template<typename T, const char* N>
class Interface
{
};

template<typename, const char*...>
class Example;

template<typename... Ts, const char*... Ns>
class Example<std::tuple<Ts...>, Ns...> : public Interface<Ts, Ns>...
{
};
like image 124
Patrick Roberts Avatar answered Nov 15 '22 15:11

Patrick Roberts