这个问题来自我上一个问题:Why shouldn't C++ operator new/delete/variants be in header files?。为了快速总结,我正在学习如何覆盖全局运算符new
,delete
等。我现在需要一个自定义分配器类(我的重载运算符new调用std::set::insert(...)
,它本身似乎调用new
,因此产生了无限的回响)。我认为,如果我向malloc
提供自定义分配器(例如,使用new
而不是std::set
),则可以绕过无限递归。
我已经阅读了一些有关实现自定义分配器的内容,并且对struct rebind
的语义有些困惑。
这里有一个很好的问答:Parsing allocator::rebind calls,但是我仍然对一个特定的项目感到困惑。 cplusplus.com说关于struct rebind
:
我不明白other
是struct rebind
的成员。我发现的struct rebind
的定义如下:
template <class Type> struct rebind {
typedef allocator<Type> other;
};
我看不到
other
是struct rebind
的成员变量。这只是typedef
ed。如果我在全局 namespace 中执行了typedef int foo;
,那并不意味着在全局 namespace 中声明了一个类型为int
的全局变量,那么other
又如何成为struct rebind
的成员呢?顺便说一句,我知道(或者至少我读过)在C++ 11之后,这一切都得到了简化,但是我仍然想首先理解这一点,这样我才能掌握基础知识。谢谢你的帮助。
在这个主题上时,有人还能在结构中解释
typedef
的处理吗?我以前在回答者Johannes Schaub的amazing example中看到过它,但是我还没有完全理解它。对我来说,它似乎将typedef的范围限制在包含struct的实例内。更新:
我想将此添加到我的问题中。使用来自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;
的好方法吗? 最佳答案
不是。
那就对了。正如引用一样,它是成员类型。
很难给出一个不会简单地遇到相同问题的示例(因为您没有陈述您对litb的示例不了解的地方),但是我们开始:
struct Foo
{
typedef int bar;
};
Foo::bar x = 42; // creates an int named `x`, because Foo::bar is int
那就对了。结果类型是类的成员,就像嵌套的类一样,就像类是其封闭的 namespace 的成员一样。
不,成员类型在该语言的任何版本中都没有根本改变(尽管新的
using
语法使声明它们更加容易)。不,但是全局 namespace 中将存在一个名为
foo
的类型。是;很长的路要走,不管
a1
是什么,它都可以工作(因此结果可能根本不是std::allocator<T>
)。在编写模板时,这一点很重要。关于c++ - struct rebind::other是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39338032/