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 callsstd::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之后这些都被简化了
不,在该语言的任何修订版中,成员类型都没有发生根本性的变化(尽管新的使用
语法使声明它们变得更容易)
如果我做了typedefintfoo在全局命名空间中,这并不意味着在全局命名空间中声明了类型为int
的全局变量
没有,但是在全局命名空间中会有一个名为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