这个问题来自我之前的问题:Why shouldn't C++ operator new/delete/variants be in header files?。为了快速总结,我正在学习覆盖全局运算符new
,delete
等。我现在需要一个自定义分配器类(我的重载运算符新调用std::set::insert(...)
,这似乎本身叫new
,因此无限回归)。我认为如果我向我的malloc
提供自定义分配器(例如,使用new
而不是std::set
),我可以绕过无限递归。
我已经完成了关于实现自定义分配器的一些阅读,并且对struct rebind
的语义感到有些困惑。
这里有一个很好的Q& A:Parsing allocator::rebind calls,但我仍然对一个特定的项目感到困惑。 cplusplus.com说struct rebind
:
其成员类型other是等效分配器类型,用于分配类型为
的元素
我不明白other
如何成为struct rebind
的成员。我发现struct rebind
的定义如下:
template <class Type> struct rebind {
typedef allocator<Type> other;
};
我不知道other
是struct rebind
的成员变量。这只是typedef
。如果我在全局命名空间中执行typedef int foo;
,那并不意味着在全局命名空间中声明了一个类型为int
的全局变量,反过来,other
如何成为struct rebind
?
顺便说一句,我知道(或者至少我已经读过)这已经在C ++ 11之后被简化了,但是我仍然想先了解这一点,这样我的基础知识就会降低。谢谢你的帮助。
在这个主题上,有人也可以在结构中解释typedef
的交易吗?我曾经在应答者约翰内斯·绍布(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;
吗?
答案 0 :(得分:4)
我不知道其他人是
struct rebind
的成员变量。
不是。
它只是
typedef
编辑。
那是对的。它就是类型的成员,就像报价所说的那样。
在这个主题上,有人也能解释一下结构中的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之后得到了简化
不,成员类型在语言的任何修订版中都没有根本改变(尽管新的using
语法可以更容易地声明它们。)
如果我在全局命名空间中
typedef int foo;
,那并不意味着在全局命名空间中声明了int
类型的全局变量
不,但在全局命名空间中会有一个名为foo
的类型。
decltype(a1)::rebind<std::string>::other a2_1;
行std::allocator<std::string> a2_1;
还有很长的路要说a1
?
是;很长的路,以及无论std::allocator<T>
是什么都有效的方式(因此结果可能根本不是create
)。当你编写模板时,这很重要。