struct rebind::other 是啥意思?
Posted
技术标签:
【中文标题】struct rebind::other 是啥意思?【英文标题】:What does struct rebind::other mean?struct rebind::other 是什么意思? 【发布时间】:2016-09-05 21:44:20 【问题描述】:这个问题来自我之前的问题:Why shouldn't C++ operator new/delete/variants be in header files?。快速总结一下,我正在学习覆盖全局运算符 new
、delete
等。我现在需要一个自定义分配器类(我的重载运算符 new 调用 std::set::insert(...)
,它本身似乎调用 new
,因此无限回避)。我认为如果我向我的std::set
提供一个自定义分配器(例如,使用malloc
而不是new
),我可以绕过无限递归。
我已经阅读了一些关于实现自定义分配器的文章,但对 struct rebind
的语义有些困惑。
这里有一个很好的问答:Parsing allocator::rebind calls,但我仍然对一个特定的项目感到困惑。 cplusplus.com 说struct rebind
:
它的成员类型other是分配Type类型元素的等价分配器类型
我不明白other
是如何成为struct rebind
的成员的。我发现struct rebind
的定义如下:
template <class Type> struct rebind
typedef allocator<Type> other;
;
我看不出other
是struct rebind
的成员变量。这只是typedef
ed。如果我在全局命名空间中做了typedef int foo;
,那并不意味着在全局命名空间中声明了int
类型的全局变量,那么反过来,other
如何成为struct rebind
的成员?
顺便说一句,我知道(或者至少我已经读过)在 C++11 之后这一切都得到了简化,但我仍然想先了解这一点,这样我才能掌握基础知识。感谢您的帮助。
在这个话题上,有人能解释一下在结构中处理typedef
ing 吗?我以前在回答者 Johannes Schaub 的 amazing example 中看到过一次,但我还没有完全理解它。在我看来,它似乎将 typedef 的范围限制在包含结构的实例内。
更新:
我想将此添加到我的问题中。使用来自 cppreference.com 的这个精简示例:
#include <memory>
#include <iostream>
#include <string>
int main()
std::allocator<int> a1; // default allocator for ints
decltype(a1)::rebind<std::string>::other a2_1;
decltype(a1)::rebind<std::string>::other a2_1;
的行不是说std::allocator<std::string> a2_1;
很长吗?
【问题讨论】:
typedef
ing 在struct
中允许您根据给定模板选择类型。就这样。你可能有专门的专业来做一些特别的事情,但就是这样。虽然,make_integer_sequence
的实现使用了一些很酷的递归来满足您的需求。
【参考方案1】:
我没有看到 other 是
struct rebind
的成员变量。
不是。
只是
typedef
ed。
没错。它是一个成员type,正如引用所说的那样。
关于这个话题,有人能解释一下在结构中的类型定义吗?我以前在回答者 Johannes Schaub 的这个惊人的例子中看到过一次,但我还没有完全理解它。
很难给出一个不存在相同问题的示例(因为您没有说明您对 litb 示例的不理解之处),但我们开始吧:
struct Foo
typedef int bar;
;
Foo::bar x = 42; // creates an int named `x`, because Foo::bar is int
在我看来,它似乎将 typedef 的范围限制在包含结构的实例内。
没错。结果类型是类的成员,就像嵌套类一样,就像类是其封闭命名空间的成员一样。
顺便说一句,我知道(或者至少我已经读过)这在 C++11 之后都被简化了
不,成员类型在语言的任何版本中都没有发生根本性的变化(尽管新的using
语法可选地使声明它们变得更容易)。
如果我在全局命名空间中做了
typedef int foo;
,这并不意味着在全局命名空间中声明了int
类型的全局变量
不,但在全局命名空间中会有一个名为foo
的类型。
decltype(a1)::rebind<std::string>::other a2_1;
的行不是说std::allocator<std::string> a2_1;
很长吗?
是的;很长的路要走,而且不管a1
是什么都行得通(所以结果可能根本不是std::allocator<T>
)。这在您编写模板时很重要。
【讨论】:
令人着迷。再次感谢@LightnessRacesInOrbit(我想你以前回答过我的其他问题)。成员 types 相对于成员 variables 的概念对我来说是新的。不过,您的回答正在帮助我了解情况。并不是说我曾经认为自己是最伟大的 C++ 程序员,而是我曾经(天真地)认为我掌握了这门语言。有这么多新奇的东西有待发现是多么有趣。 @StoneThrow: 哦这么多:) 而且大多数都是完全可笑的哈哈 @StoneThrow:成员类型在整个 C++ 标准库中使用。以std::vector<T>::iterator
为例。 en.cppreference.com/w/cpp/container/vector以上是关于struct rebind::other 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
#define LEN sizeof(struct shu) 是啥意思
typedef enum与typedef struct分别是啥意思
链栈结构代码中typedef struct LinkStackPtr中的LinkStackPtr是啥意思
(fwrite(&stud[i],sizeof(struct student),1,fp)!=1在C语言中是啥意思
typedef struct ElemType *elem; int length; int listsize; SqList;其中ElemType *elem;是啥意思