Контейнеры специализации шаблонов

Я открою вопрос с примером кода:

 template <template <class, class> class Container>
class Schedule {
public:

Schedule& print( std::ostream& os);

private:
Container<Course*, std::allocator<Course*> >  courses;
};

// implement funcion print:

template <template <class, class> class Container>
Schedule<Container>& Schedule<Container>::print(std::ostream& os){

std::sort(courses.begin(), courses.end(), sor_con());
std::for_each(courses.begin(), courses.end(), PrintContainer(os));
return *this;
}

template<>
Schedule<std::list>& Schedule<std::list>::print(std::ostream& os){

courses.sort(sort_con());
std::for_each(courses.begin(), courses.end(), PrintContainer(os));
return *this;
}

Schedule класс содержит шаблоны классов (std::list / std::vector) только. Поскольку print функция должна использовать сортировку, мне нужно использовать два разных способа для реализации этого: std::sort из за std::vector а также sort функция списка контейнеров для std::list,

Мой код работает, но я думаю, что создал ненужное дублирование кода здесь. Есть ли более эффективный способ решить эту проблему?

1

Решение

Вы можете перегрузить sort функция для std::vector а также std::list соответственно:

template<typename T, typename Compare>
void sort(std::list<T> &list, Compare f)
{
list.sort(f);
}

template<typename T, typename Compare>
void sort(std::vector<T> &vector, Compare f)
{
std::sort(vector.begin(), vector.end(), f);
}

Или используйте type_traits и tag_dispatching:

#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
#include <functional>

struct vectorlike_tag { };
struct listlike_tag   { };

template <typename C> struct container_traits;

template <typename T, typename A>
struct container_traits<std::vector<T, A>> {
typedef vectorlike_tag category;
};

template <typename T, typename A>
struct container_traits<std::list<T, A>> {
typedef listlike_tag category;
};

template <typename Container, typename Compare>
void sort_helper(Container& c, Compare f, vectorlike_tag) {
std::sort(c.begin(), c.end(), f);
}

template <typename Container, typename Compare>
void sort_helper(Container& c, Compare f, listlike_tag) {
c.sort(f);
}

template <typename Container, typename Compare>
void sort_container(Container &c, Compare f) {
sort_helper(c, f, typename container_traits<Container>::category());
}

template<class Container>
void sort_container(Container &c)
{
sort_helper(c, std::less<typename Container::value_type>(), typename container_traits<Container>::category());
}

int main()
{
std::vector<int> v{ 4, 3, 7, 8, 9 };
sort_container(v);
for (auto e : v) std::cout << e << " ";
std::cout << std::endl;
std::list<int> lst{ 4, 3, 7, 8, 9 };
sort_container(lst, std::greater<int>());
for (auto e : lst) std::cout << e << " ";
std::cout << std::endl;
return 0;
}
1

Другие решения


По вопросам рекламы [email protected]