gpt4 book ai didi

c++ - struct rebind::other 是什么意思?

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:34 26 4
gpt4 key购买 nike

这个问题来 self 之前的问题:Why shouldn't C++ operator new/delete/variants be in header files? .快速总结一下,我正在学习重写全局运算符 new , delete等。我现在需要一个自定义分配器类(我的重载运算符新调用 std::set::insert(...) ,它本身似乎调用 new ,因此无限回避)。我认为如果我为我的 malloc 提供自定义分配器(例如,使用 new 而不是 std::set )我可以绕过无限递归。

我已经阅读了一些关于实现自定义分配器的文章,并且对 struct rebind 的语义有点困惑。 .

这里有很好的问答:Parsing allocator::rebind calls ,但我仍然对某个特定项目感到困惑。 cplusplus.com 说 struct rebind :

Its member type other is the equivalent allocator type to allocate elements of type Type

我不明白otherstruct rebind 的成员. struct rebind 的定义我发现看起来像:

template <class Type> struct rebind {
typedef allocator<Type> other;
};

我不明白 otherstruct rebind的成员变量.就是typedef编辑。如果我做了typedef int foo;在全局命名空间中,这并不意味着有一个类型为 int 的全局变量在全局命名空间中声明,那么反过来,other 又如何呢?成为struct rebind的成员(member)?

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

在这个话题上,有人能解释一下处理typedef吗?在一个结构中?我以前在这个 amazing example 看过一次来自回答者 Johannes Schaub,但我还没有完全理解它。在我看来,它似乎将 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;

最佳答案

I don't see how other is a member variable of struct rebind.

不是。

It's just typedefed.

没错。它是一个成员 type,正如引用所说。

While on this topic, can someone also explain the deal with typedefing within a struct? I've seen it once before in this amazing example from answerer Johannes Schaub, but I don't fully grok it yet.

很难给出一个不会简单地遇到相同问题的示例(因为您没有说明您对 litb 的示例不了解的地方),但我们开始吧:

struct Foo
{
typedef int bar;
};

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

To me it looks like it's restricting the scope of the typedef to within an instance of the containing struct.

没错。结果类型是类的成员,就像嵌套类一样,就像类是其封闭命名空间的成员一样。

By the way, I know (or at least I've read that) this has all been simplified post C++11

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

If I did typedef int foo; in the global namespace, that doesn't mean there's a global variable of type int declared in the global namespace

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

Isn't the line decltype(a1)::rebind<std::string>::other a2_1; a long way of saying std::allocator<std::string> a2_1; ?

是的;很长的路要走,无论如何都行得通a1是(所以结果可能根本不是 std::allocator<T>)。这在您编写模板时很重要。

关于c++ - struct rebind::other 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39338032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com