jackscorrow
jackscorrow

Reputation: 702

Class template with variable type of container

I would like to know if it's possible to create a class template with an object that has to be a container but of a kind specified by the user.

For example, now I have a class like this:

template<class T>
class Myclass {
    std::queue<T> queue;

    // SOME OTHER MEMBERS
}

But I would like to be able to make that std::queue object some other type of container when needed, like a std:stack, in order to be able to handle also containers with other kind of policies other than FIFO.

Is it possible? Or are there any other solutions that don't involve me creating another class exactly like this but with a stack instead of a queue?

Upvotes: 3

Views: 1469

Answers (1)

NathanOliver
NathanOliver

Reputation: 180415

Sure you can. This is called a container adapter. std::queue itself is a container adapter and looks like

template<class T, class Container = std::deque<T>> 
class queue
{
    //...
};

Doing that though requires you to use something like

std::queue<int, std::vector<int>> foo;

If you want to change the container. If you do not want to have to specify the template type of the container then you can use a template template like

template<class T, template<typename...> class Container = std::queue> 
class Myclass
{
    Container<T> cont;
};

and you can use it like

Myclass<int, std::set> foo;

To change it to use a std::set instead of the default std::queue.

Upvotes: 5

Related Questions