notaorb
notaorb

Reputation: 2190

Operator overloading with template question

I'm unable to recognize the following forms of operator overloading, specifically with the template parameter involved. I found this while reading an article on nullptr. I do not see these forms on cppreference overloading page either.

Can anyone explain these forms of overloading and what they are doing?

Thanks

struct nullptr_t 
{
    void operator&() const = delete;  // Can't take address of nullptr

    template<class T>
    inline operator T*() const { return 0; }

    template<class C, class T>
    inline operator T C::*() const { return 0; }
};
nullptr_t nullptr;

Upvotes: 0

Views: 86

Answers (1)

Mooing Duck
Mooing Duck

Reputation: 66981

Starting simpler:

struct A {
    operator int() {return 3;}
};
void function() {
    A aobject;
    int value = aobject; //uses A::operator int()
    //value is now 3
}

operator int is a curious member function that allows the struct to be converted to an int. It's very curious in that it's the only case in C++ that uses the return type in order to resolve which overloaded function to call, including that it can resolve template types.

struct A {
    operator int*() {return 0;}
};
void function() {
    A aobject;
    int* value = aobject; //uses A::operator int()
    //value now holds the value 0 (NULL)
} 

This is the same thing, but now A can be converted to an int*. It is otherwise self explanatory.

struct A {
    template<class T>
    operator T*() { return 0; }
};
void function() {
    A aobject;
    short* value = aobject; //uses A::operator T*<int>()
    //value now holds the value 0 (NULL)
}

By making A::operator T*() a template method, we can make our class able to be converted to a pointer to any type. This expands the options for what you can convert to. operator T C::*() { return 0; } is similar, but also allows conversion to pointers to any member of any class, which is very rare and advanced.

Upvotes: 1

Related Questions