|
Boost : |
From: helmut.zeisel_at_[hidden]
Date: 2001-08-22 02:46:45
--- In boost_at_y..., John Max Skaller <skaller_at_m...> wrote:
>
> Interesting! What is the relationshup between
> a 'solver' and the 'interface' of an algorithm?
> [No, I should say 'a collection of algorithms' which solve
> the same problem]
>
>
> In particular: using the notion of specialisation,
> an STL algorithm interface still only admits ONE algorithm
> as a solver: you can't have two ways to 'sort' iterators
> of the same _type_, because specialisation is type based.
>
> That constraint doesn't apply to class based
> (virtual function based) polymorphism.
>
I am not sure whether I understand you correctly,
but IMHO the template-equivalent to virtual functions
can be achieved using something like traits.
Take some hypothetic container-sort:
struct bubblesort_tag {};
struct quicksort_tag {};
template<typename C> struct container_traits
{
typedef quicksort_tag sort_tag;
};
template<typename Container> void sort(Container& c)
{
sort(c,typename container_traits<c>::sort_tag());
}
template<typename Container> void sort(Container& c, bubblesort_tag)
{
...
}
template<typename Container> void sort(Container& c, quicksort_tag)
{
...
}
For a special Container, you can now use either
the default version or, if you need a different, a special version:
vector<int> v;
...
sort(v); // default as defined in container_traits<vector<int> >
...
sort(v,bubblesort_tag()) // special version
...
If container_traits<vector<int> >::sort_tag is different
from container_traits<list<int> >::sort_tag,
sort will internally call different algorithms for different
container typs.
I do not know whether you count this
as "one" or "several" interfaces ...
But as I understood, you do not like traits anyway.
Helmut
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk