У меня есть следующий класс:Как обобщить контейнерные адаптеры с шаблонами?
#include <set>
#include <stack>
#include <queue>
#include <string>
template <typename T>
class MySet
{
public:
const std::stack<T> data() const
{
std::stack<T> other_cont (typename std::stack<T>::container_type (cont.begin(), cont.end()));
return other_cont;
}
private:
std::set<T> cont;
};
И следующий код:
MySet<std::string> a;
MySet<int> b;
const std::stack<std::string> s = a.data();
const std::queue<int> q = b.data();
Я хотел бы использовать один шаблонную функцию чтобы инициализировать любой тип адаптера. Пока он работает только с stack
или queue
, я не могу понять, как использовать шаблоны для его обобщения.
Это то, что я пробовал:
template <template <typename> typename M>
const M<T> data() const
{
M<T> other_cont (typename M<T>::container_type (cont.begin(), cont.end()));
return other_cont;
}
Компилятор говорит, что не может вывести параметр шаблона M
.
Я не думаю, что компилятор может когда-либо выводим параметр в вашем случае. Попробуйте const 'std :: queue q = b.data ();' или даже 'std :: queue q = b.data >();' –
Извините, я не упоминал об этом является частью какого-либо материала из экзаменов прошлых лет, и я не могу коснуться второго блока кода. – Jani
Я только предположил, что я должен решить это с помощью шаблонов, поскольку код для обоих адаптеров идентичен. – Jani