首页 > 解决方案 > 带有模板问题的运算符重载

问题描述

我无法识别以下形式的运算符重载,特别是涉及的模板参数。我在阅读有关 nullptr的文章时发现了这一点。我也没有在cppreference 重载页面上看到这些表单。

谁能解释这些形式的重载以及它们在做什么?

谢谢

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;

标签: c++

解决方案


开始更简单:

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

operator int是一个奇怪的成员函数,它允许将 struct 转换为int. 非常奇怪的是,它是 C++ 中唯一使用返回类型来解析要调用哪个重载函数的情况,包括它可以解析模板类型。

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

这是同样的事情,但现在A可以转换为int*. 否则,它是不言自明的。

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)
}

通过制作A::operator T*()模板方法,我们可以使我们的类能够转换为指向任何类型的指针。这扩展了您可以转换为的选项。operator T C::*() { return 0; }类似,但也允许转换为指向任何类的任何成员的指针,这是非常少见和高级的。


推荐阅读