How about something along these lines?
template<class ObjectType>
class List
{
ObjectType *first_, *last_;
public:
void addObject(ObjectType *o)
{
insertAfter(this, last_, o);
}
void insertAfter(ObjectType *node, ObjectType *newNode)
{
newNode->prev_ = node;
newNode->next_ = node->next_;
if(nullptr == node->next_)
this->last_ = newNode;
else
node->next_->prev_ = newNode;
node->next_ = newNode;
}
};
class Object
{
private:
Object *prev_, *next_;
friend class List<Object>;
};
int main() {}
I can't see how it's really less offensive than what you've been doing already, though: template code is inline anyway, so you can't stop people from rewriting your class to their liking. Just relax and have reasonable degree of trust in your clients :)