C++ 带模板问题的运算符重载

C++ 带模板问题的运算符重载,c++,C++,我无法识别以下形式的运算符重载,特别是涉及模板参数的情况。我在读一篇关于nullptr的文章时发现了这个。我也看不到这些表格 有人能解释一下这些形式的过载以及它们在做什么吗 谢谢 struct nullptr_t { void operator&() const = delete; // Can't take address of nullptr template<class T> inline operator T*() const { ret

我无法识别以下形式的运算符重载,特别是涉及模板参数的情况。我在读一篇关于nullptr的文章时发现了这个。我也看不到这些表格

有人能解释一下这些形式的过载以及它们在做什么吗

谢谢

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;
struct nullptr\t
{
void运算符(&()const=delete;//无法获取nullptr的地址
模板
内联运算符T*()常量{return 0;}
模板
内联运算符tc::*()常量{return 0;}
};
nullptr_t nullptr;
启动更简单:

struct A {
    operator int() {return 3;}
};
void function() {
    A aobject;
    int value = aobject; //uses A::operator int()
    //value is now 3
}
运算符int
是一个奇特的成员函数,它允许将结构转换为
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{ 模板 运算符T*(){返回0;} }; 空函数(){ 对象; short*value=aobject;//使用::运算符T*() //值现在保存值0(NULL) }
通过使
A::operator T*()
成为模板方法,我们可以将类转换为指向任何类型的指针。这将扩展可转换为的选项<代码>运算符tc::*(){return 0;}类似,但也允许转换为指向任何类的任何成员的指针,这是非常罕见和高级的。

此代码描述了nullptr的工作方式,但实际上不是
nullptr
的工作方式<代码> nulpPTR <代码>是C++中的关键字,是语言内置的。我被模板参数<代码> t>代码>混淆了,使用前缀<代码> *>代码>然后再次在第二个模板成员函数中。两个代码> T < /C>参数不相关,可以使用不同的名称。虽然我遇到过这样的实例,其中nullptr关键字是以这种方式模拟的,用于不完全符合C++11的编译器(缺少
nullptr
,可变模板和正确的基于范围的循环比我希望的更为常见)。我想这也缺少一些常量限定符,例如,
nullptr\t nullptr前面的
constexpr
和标准库中各种函数的专门化根据我到目前为止的经验,函数模板参数是从传递的函数参数或模板参数推导出来的。在这种情况下,还可以隐式推导用户定义的转换运算符类型(它是模板参数值)。这有意义吗?
模板操作符T*()
是一个模板,可以在编译时生成成员函数。它将生成
操作符short*()
,作为许多可能的成员函数之一。实际上,我并不完全确定如何调用这样的特定重载,但一般来说,您只需要使用
static_cast(aObject)
int(aObject)
(int)aObject
@notorb两者都有,尽管从技术上讲,语言规则说转换运算符没有返回类型。它的名称是返回类型。或者它也是一种参数类型,这将使这种推断与其他情况保持一致。@notaorb
tc:*
是指向C类成员的语法,C类成员的类型为T(T可以是任何类型,包括函数类型)。这允许将
nullptr\t
实例转换为指向类成员的任何指针。当我第一次看到这种语法时,我对它的简单性感到困惑和高兴,这让我明白了很多。我对将指向成员函数的指针指定为实际成员函数感到困惑,并在此处创建了一个新问题: