C++ struct rebind::other是什么意思?

C++ struct rebind::other是什么意思?,c++,memory,memory-management,C++,Memory,Memory Management,这个问题来自我之前的一个问题:。简而言之,我正在学习覆盖全局运算符new,delete,等等。我现在需要一个自定义的分配器类(我重载的运算符new callsstd::set::insert(…),它本身似乎调用new,因此无限重复)。我认为如果我向我的std::set提供一个自定义分配器(例如,它使用malloc而不是new),我就可以绕过无限递归 我读了一些关于实现自定义分配器的书,对struct-rebind的语义有点困惑 这里有一个很好的问答:,但我还是被一个特别的项目弄糊涂了。cplu

这个问题来自我之前的一个问题:。简而言之,我正在学习覆盖全局运算符
new
delete
,等等。我现在需要一个自定义的分配器类(我重载的运算符new calls
std::set::insert(…)
,它本身似乎调用
new
,因此无限重复)。我认为如果我向我的
std::set
提供一个自定义分配器(例如,它使用
malloc
而不是
new
),我就可以绕过无限递归

我读了一些关于实现自定义分配器的书,对
struct-rebind
的语义有点困惑

这里有一个很好的问答:,但我还是被一个特别的项目弄糊涂了。cplusplus.com说关于结构重新绑定

其成员类型other是分配类型为的元素的等效分配器类型

我不明白
other
如何成为
struct-rebind
的成员。我发现的
struct-rebind
的定义如下:

template <class Type> struct rebind {
  typedef allocator<Type> other;
};
是不是行
decltype(a1)::rebind::other a2_1一个很长的说法
std::allocator a2_1

我不知道other是如何成为
struct-rebind
的成员变量的

不是

它只是
typedef
ed

对。这是一种成员类型,正如引用所说

在这个话题上,有人能解释一下结构中的typedefing吗?我以前在回答者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之后这些都被简化了

不,在该语言的任何修订版中,成员类型都没有发生根本性的变化(尽管新的
使用
语法使声明它们变得更容易)

如果我做了
typedefintfooint
的全局变量

没有,但是在全局命名空间中会有一个名为
foo
的类型

是不是行
decltype(a1)::rebind::other a2_1一个很长的说法
std::allocator a2_1


对,;这是一条很长的路,无论
a1
是什么,它都能起作用(因此结果可能根本不是
std::allocator
)。编写模板时,这一点很重要。

typedef
ing在
结构中
允许您基于给定模板选择类型。这就是全部。你可能有专门的地方做一些特殊的事情,但就是这样。尽管如此,
make_integer_sequence
的实现使用了一些很酷的递归来满足您的需要。再次感谢@LightnessRacesInOrbit(我想你之前已经回答了我的其他问题)。与成员变量相对的成员类型概念对我来说是新概念。不过,你的回答有助于我了解情况。并不是我曾经认为自己是最伟大的C++程序员,但我过去天真地认为我精通语言。有这么多新奇的东西有待发现,这是多么有趣啊。@StoneThrow:哦,那么多:)而且大多数都是完全可笑的lol@StoneThrow成员类型都在C++标准库中使用。例如,看看
std::vector::iterator
struct Foo
{
   typedef int bar;
};

Foo::bar x = 42;  // creates an int named `x`, because Foo::bar is int