Re: Convenient typedef of base classes
On Dec 2, 10:34 am, Dragan Milenkovic <dra...@plusplus.rs> wrote:
Was something like this ever suggested?
(I'm expecting the answer - it's already in C++0x :-)
template <typename A, typename B>
class Bar : public Foo<typename std::remove_const<A>::type, B> = Base {
...
};
to be equivalent to:
template <typename A, typename B>
class Bar : public Foo<typename std::remove_const<A>::type, B> {
typedef Foo<typename std::remove_const<A>::type, B> Base;
...
};
I think this might lead to disorderly code, especially in cases of
multiple inheritance where you'd have base1 and base2.
template <typename A, typename B>
class Bar : public Foo<typename std::remove_const<A>::type, B> = Base
{
// Typedef list.
typedef type-expression Type1;
typedef type-expression Type2;
typedef type-expression Type3;
void f( Base x );
};
If I were reading this code, I would see Base and, not recognizing the
type and assuming it's a typedef, I'd look at the typedef list. Not
seeing it, I would be lost. Furthermore, I would not be in the habit
of looking at the inheritance line for typedef info and it may not be
intuitive when first I see it. It also further clutters the class
definition. However...
template <typename A, typename B>
class Bar : public typedef Bar::Base {
// Typedef list.
typedef type-expression Type1;
typedef type-expression Type2;
typedef type-expression Type3;
typedef Foo<typename std::remove_const<A>::type, B> Base;
void f( Base x );
};
would be more appealing to me. Here, Bar:: signifies that the typedef
is internal and it's intuitive because I already understand scope
resolution, so this introduced no new logic to me.
Or perhaps
template <typename A, typename B>
// Typedef list.
typedef type-expression Type1;
typedef type-expression Type2;
typedef type-expression Type3;
typedef Foo<typename std::remove_const<A>::type, B> Base;
class Bar : public Base {
void f( Base x );
};
Although, this is not preferable to me as there is a lot of
information about the class presented before I've even read its name!
And, this would be an odd and unconventional place to hide the typedef
list.
Then again, I've wanted to do this for a long time:
template< class T, class Y >
{
typedef T int_type;
typedef Y int_type2;
void f( int_type, int_type2) {}
void g( int_type, int_type2) {}
typedef Y float_type;
void h( int_type, float_type) {}
}
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]