c++ - 带有模板问题的运算符重载
问题描述
我无法识别以下形式的运算符重载,特别是涉及的模板参数。我在阅读有关 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;
解决方案
开始更简单:
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; }
类似,但也允许转换为指向任何类的任何成员的指针,这是非常少见和高级的。
推荐阅读
- linux - 关于 WSL 问题的 vscode:打开括号或大括号时编辑光标向后移动
- ntfs - NTFS 磁盘上的 $MFT 中有错误的 $FILE_NAME 条目
- javascript - 如何通过导出导出相同的函数但具有不同的参数
- sql - Oracle SQL:在没有子查询连接的情况下从另一个表中排除 ID
- javascript - Preloader - 从子页面返回主页面时如何关闭它?
- symfony - Symfony 中返回了意外的集合
- r - R 数据表中的交互式突出显示
- java - 如何解析包含我用作分隔符的相同符号的字符串?
- react-native - Native Base 和 TabNavigator 在 tabBarComponent 中获得活动状态
- c# - 如何在 Unity 中更改音频剪辑