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?。快速总结一下,我正在学习覆盖全局运算符 newdelete 等。我现在需要一个自定义分配器类(我的重载运算符 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;
;

我看不出otherstruct rebind 的成员变量。这只是typedefed。如果我在全局命名空间中做了typedef int foo;,那并不意味着在全局命名空间中声明了int类型的全局变量,那么反过来,other如何成为struct rebind的成员?

顺便说一句,我知道(或者至少我已经读过)在 C++11 之后这一切都得到了简化,但我仍然想先了解这一点,这样我才能掌握基础知识。感谢您的帮助。

在这个话题上,有人能解释一下在结构中处理typedefing 吗?我以前在回答者 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&lt;std::string&gt;::other a2_1; 的行不是说std::allocator&lt;std::string&gt; a2_1; 很长吗?

【问题讨论】:

typedefing 在struct 中允许您根据给定模板选择类型。就这样。你可能有专门的专业来做一些特别的事情,但就是这样。虽然,make_integer_sequence 的实现使用了一些很酷的递归来满足您的需求。 【参考方案1】:

我没有看到 other 是struct rebind 的成员变量。

不是。

只是typedefed。

没错。它是一个成员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&lt;std::string&gt;::other a2_1; 的行不是说std::allocator&lt;std::string&gt; a2_1; 很长吗?

是的;很长的路要走,而且不管a1 是什么都行得通(所以结果可能根本不是std::allocator&lt;T&gt;)。这在您编写模板时很重要。

【讨论】:

令人着迷。再次感谢@LightnessRacesInOrbit(我想你以前回答过我的其他问题)。成员 types 相对于成员 variables 的概念对我来说是新的。不过,您的回答正在帮助我了解情况。并不是说我曾经认为自己是最伟大的 C++ 程序员,而是我曾经(天真地)认为我掌握了这门语言。有这么多新奇的东西有待发现是多么有趣。 @StoneThrow: 哦这么多:) 而且大多数都是完全可笑的哈哈 @StoneThrow:成员类型在整个 C++ 标准库中使用。以std::vector&lt;T&gt;::iterator 为例。 en.cppreference.com/w/cpp/container/vector

以上是关于struct rebind::other 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

#define LEN sizeof(struct shu) 是啥意思

typedef enum与typedef struct分别是啥意思

((struct ip *)0)是啥意思???

链栈结构代码中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;是啥意思