Something I have found myself doing often lately is declaring typedefs relevant to a particular class inside that class, i.e.
class Lorem
{
typedef boost::shared_ptr<Lorem> ptr;
typedef std::vector<Lorem::ptr> vector;
//
// ...
//
};
These types are then used elsewhere in the code:
Lorem::vector lorems;
Lorem::ptr lorem( new Lorem() );
lorems.push_back( lorem );
Reasons I like it:
- It reduces the noise introduced by the class templates,
std::vector<Lorem>
becomesLorem::vector
, etc. - It serves as a statement of intent – in the example above, the Lorem class is intended to be reference counted via
boost::shared_ptr
and stored in a vector. - It allows the implementation to change – i.e. if Lorem needed to be changed to be intrusively reference counted (via
boost::intrusive_ptr
) at a later stage then this would have minimal impact to the code. - I think it looks ‘prettier’ and is arguably easier to read.
Reasons I don’t like it:
- There are sometimes issues with dependencies – if you want to embed, say, a
Lorem::vector
within another class but only need (or want) to forward declare Lorem (as opposed to introducing a dependency on its header file) then you end up having to use the explicit types (e.g.boost::shared_ptr<Lorem>
rather thanLorem::ptr
), which is a little inconsistent. - It may not be very common, and hence harder to understand?
I try to be objective with my coding style, so it would be good to get some other opinions on it so I can dissect my thinking a little bit.