|
Re: On the Tension Between Object-Oriented and Generic Programming in C++
|
Posted: Oct 16, 2007 11:00 AM
|
|
Type erasure is the C++ way of achieving structural subtyping. Given that C++ is a strongly typed language, having structural subtyping is anything but fundamental - in fact it is quite amazing that it works.
As for the rest, blah, blah, blah.
Anyway, I ran into the is_iterator trap a short time ago. Consider this overload set:
template <typename T> data_holding_object<T> make_dho();
template <typename Iterator> data_holding_object< typename std::iterator_traits<Iterator>::value_type > make_dho(Iterator first, Iterator last);
Harmless, right? I want an empty dho, I create one using make_dho<int>() (the actual situation in my library is more complex; directly using the data_holding_object type is impractical). I want a pre-filled one, I create one using make_dho(v.begin(), v.end()).
Well ... except that creating the overload set fails in GCC 4. (Haven't tested other compilers yet.) make_dho<int>() fails to compile. I got quite creative trying to implement is_iterator. I thought I had a solution that works using lazy_enable_if - only to realize that the enable_if simply failed always, not just for non-iterators.
On the other hand, my type erasure in the same library works beautifully. Being able to write source<int> instead of a type that would fill 5 lines and have only a single virtual call per operation as overhead is really nice.
|
|