У меня есть класс шаблона, представляющий массив числовых значений.частичная специализация функции в классе шаблона
Я хочу, чтобы этот класс работал для любого типа числового значения (например, int, double и т. Д.) И трех типов контейнеров (std :: vector, std :: deque и std :: list).
Вот соответствующие биты реализации для моей конкретной задачи:
template < typename Numeric_t, typename Container = std::vector<Numeric_t> >
class Array {
// field member
Container m_data;
// other stuff here
// ...
// random element access for std::vector and std::deque
Numeric_t & operator[] (unsigned int index) { return m_data[index]; }
// random element access for std::list
Numeric_t & operator [] (unsigned int index) {
std::list<Numeric_t> :: iterator it = m_data.begin();
std::advance(it, index);
return *it;
}
}
Конечно, компилятор не позволяет мне перегружать оператор [].
Что мне нужно - это частичная специализация для operator [] для std :: list, но специализация частичного шаблона не допускается ни на C++.
(Я знаю, что доступ к случайным элементам неэффективен для списка, но здесь дело не в этом).
В идеале, в коде клиента я хотел бы использовать класс Array, как это:
Array < int, std::vector<int> > vec;
Array < int, std::list<int> > lst;
// fill arrays here
// ...
std::cout << vec[0] << std::endl;
std::cout << lst[0] << std::endl;
После долгих исследований я не смог найти рабочее решение.
Что было бы самым элегантным способом решения этой проблемы?
Благодарим за помощь.
Я думаю, вы имеете в виду «переопределить», а не «перегружать» ... но я думаю, вам нужна специализация всего класса «Array» для случая, когда «Контейнер» является «списком». – sje397
Вы пробовали написать специализацию для всего класса? Если у вас есть код, не относящийся к типам шаблонов, вы можете написать базовый класс шаблона и сделать ваши специализированные классы унаследованными от этой базы. – smichak
У нас есть вопрос по этому вопросу –