Re: const/non const member function vs. templates
On 26 Jul., 14:58, Markus Keppeler <mkeppe...@despammed.com> wrote:
Hi Together!
In some (partly legacy) code I have member functions like this:
// class Dummy (class of any type).
class XY
{
Dummy *pGetMe( (returns pointer to some
); dummy member orw=
hatever)
const Dummy *pGetMe( (returns const pointer to some
) const; dummy member or whatev=
er).
}
Since the implementations on both pGetMe's are 100% identically, only
that they use const/non const types/functions, I'd like to merge them.
I cannot implement the non-const version by calling down to the const
one, since at some level it needs to fetch the non-const pointer to
something. Here also some legacy-issues come into, so I cannot
refactor the entire design ;-).
My next thought was to use templates, like
template <class T>
T pGetMe();
, but here I don't know how to deal with the const/non constness of
the member function. Can I add the const/non const based on the type
of T?
The following is not exactly what you want but it comes quite close:
// Wrapper for plain pointers that behaves as const-correct
// accessor.
template<class t_Class>
class ConstCorrectAccessor
{
t_Class* m_InternalPointer;
public:
ConstCorrectAccessor (t_Class* Pointer)
: m_InternalPointer (Pointer)
{}
// Accessor methods with const-correct overload.
const t_Class* operator-> () const {return m_InternalPointer;}
t_Class* operator ->() {return m_InternalPointer;}
const t_Class* operator& () const {return m_InternalPointer;}
t_Class* operator& () {return m_InternalPointer;}
};
class Dummy;
class XY
{
public:
ConstCorrectAccessor<Dummy> Me;
};
void foo (const XY& xy)
{
const Dummy* OK = &xy.Me;
Dummy* DOES_NOT_COMPILE = &xy.Me;
}