I was reading the code for a smart pointer class and I could not understand a few things. The relevant portions are given below:
template <class T>
class Ptr
{
public:
struct PointerConversion
{
int valid;
};
operator int PointerConversion::*() const
{
return rawptr_ ? &PointerConversion::valid : 0;
}
private:
T * rawptr_;
};
Of course the class provides other functionality like the overloaded -> operator etc.
Basically I read this class definition up from a book about good object oriented design. The author wanted that programmers using the smart pointer should be able to write code of the form:
if( smart_ptr )
{
// pointer is valid
}
else
{
// pointer is invalid
}
Once easy way of supporting this is by defining a conversion operator to the base type T* or to bool. But the author also has a policy of not defining conversion operators until they are ABSOLUTELY unavoidable since they can allow undesirable expressions like addition of two smart pointers to be accepted by the compiler. So the authors presents the conversion operator defined above as a sort of a compromise.
So my questions are
1) What is the syntactic role of PointerConversion::*() in the definition of the conversion operator?
2) The author has not defined the valid data member as static and later used valid as a static member. Am I missing something here?
3) How does the whole scheme work?
Regards,
-- Priyendra Deshwal
Start Free Trial