
Rob Stewart wrote:
From: "Reece Dunn"
Rob Stewart wrote:
From: "Reece Dunn"
Currently, this implementation is missing iterator support (and thus
basic_string functionality that relies on begin(), end(), etc). This is because I am wondering how to map them from the basic_string adaptor to
all the
implementation (knowing that you cannot have const and non-const virtual functions).
Since when can you not have const and non-const virtual functions?
Let me rephrase:
class char_string { virtual iterator begin() = 0; virtual const_iterator begin() = 0; // oops! begin already in vtable!! };
I'm still missing something. Why would you want a non-const mf to return the const iterator type?
That was a typeo!
class char_string { virtual iterator begin() = 0; virtual const_iterator begin() const = 0; };
That is what I was referring to. You need to change the name of the const version if you are to allow virtual functions.
I have two possible solutions: [1] name the const versions cXXX (cbegin(), crend(), etc.) -- the problem with this is that you have 8 virtual functions!
I was meaning to modify the above to:
class char_string { virtual iterator begin() = 0; virtual const_iterator cbegin() = 0; // ok - cXXX variant };
You'd have those same eight variations with const and non-const virtual functions.
That's the problem -- too many virtual functions.
But if you need all eight variations, then you need eight virtual functions. Is it that you're trying to minimize what the derived class must implement for the adaptor to work? Even if that's the
That is indeed what I am trying to do.
case, because the const and non-const functions return different types, you can't have the derived class implement a const implementation function that the adaptor can use to provide both const and non-const interface functions. So what am I missing?
Nothing. You do indeed need two functions: iterator iter_offset( difference_type ); const_iterator const_iter_offset( difference_type ) const; these can be used to implement the 8 iterator functions like this: begin() const = const_iter_offset( 0 ); begin() = iter_offset( 0 ); end() const = const_iter_offset( size()); end() = iter_offset( size()); rbegin() const = const_reverse_iterator( const_iter_offset( size())); rbegin() = reverse_iterator( iter_offset( size())); rend() const = const_reverse_iterator( const_iter_offset( -1 )); rend() = reverse_iterator( iter_offset( -1 )); Regards, Reece _________________________________________________________________ Get a FREE connection, FREE modem and one month's FREE line rental, plus a US or European flight when you sign up for BT Broadband! http://www.msn.co.uk/specials/btbroadband