2016-09-05 6 views
2

この質問は私の以前のものから続きます:Why shouldn't C++ operator new/delete/variants be in header files?。すぐに要約すると、私はグローバルオペレータnewdeleteなどをオーバーライドすることを学んでいます。私はカスタムアロケータクラスを必要としています(私のオーバーロードされたオペレータnew std::set::insert(...)、これはnewというように無限の再考です)。私と思う私は私のstd::setにカスタムアロケータ(例えば、newの代わりにmallocを使用する)を供給すれば、私は無限再帰をバイパスすることができます。struct rebind :: otherは何を意味しますか?

私はカスタムアロケータの実装についていくつか読んできましたが、意味はstruct rebindで混乱しています。

良いQ &があります。ここにはParsing allocator::rebind callsがありますが、まだ特定のアイテムが混乱しています。他の

そのメンバーのタイプIはotherstruct rebindのメンバーであるかを理解していないタイプタイプ

の要素を割り当てるための同等のアロケータタイプです:cplusplus.com約struct rebindは言います。

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

私はotherstruct rebindのメンバ変数がどのように表示されていない。struct rebindの定義は、私のような表情を発見しました。それはちょうどtypedef edです。グローバルネームスペース内でtypedef int foo;を実行した場合、グローバル名前空間に宣言されたタイプintのグローバル変数があるわけではないので、otherはどのようにしてstruct rebindのメンバーになるのですか?

ところで、私はこれを読んだことがある(または少なくとも私はそれを読んだことがあります)。これはすべてC++ 11の後に簡略化されていますが、私はこれを最初に理解したいので、助けてくれてありがとう。

このトピックでは、struct内でtypedefの取引について説明する人もいますか?私はこれまでに回答者Johannes Schaubのamazing exampleでこれを見たことがありますが、私はそれをまだ完全に突き止めていません。私にとっては、typedefのスコープを含む構造体のインスタンス内に制限するように見えます。

UPDATE:私は私の質問にこれを追加したい

。 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; 
} 

std::allocator<std::string> a2_1;を言うの長い道のりラインdecltype(a1)::rebind<std::string>::other a2_1;ありませんか?

+0

'struct 'の中の' typedef'は、与えられたテンプレートに基づいてタイプを選択することを可能にします。それで全部です。特別なことをするためのスペシャライゼーションがあるかもしれませんが、それだけです。しかし、 'make_integer_sequence'の実装はあなたに必要なものを提供するためにいくつかの素早い再帰を使用します。 – AndyG

答えて

4

他のメンバー変数がstruct rebindとどのようになっているか分かりません。

そうではありません。

これはちょうどtypedefです。

そうです。見積もりと同じように、会員です。

このトピックでは、誰かがstruct内の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構文では、オプションで宣言するのがより簡単になります)。

私はグローバル名前空間

んで宣言された型intのグローバル変数がありますという意味ではありませんが、foo呼ばタイプがあるだろうグローバル名前空間にtypedef int foo;をした場合グローバルな名前空間で。

decltype(a1)::rebind<std::string>::other a2_1;は、std::allocator<std::string> a2_1;という長い道のりではありませんか?

はい。長い道のり、そしてa1に関係なく動作する方法(結果はstd::allocator<T>ではないかもしれません)。それはテンプレートを書くときに重要です。

+0

魅惑的です。もう一度@LightnessRacesInOrbitに感謝します(私はあなたが以前に私から他の質問に答えたと思います)。このメンバ_types_の概念は、メンバ_variables_とは対照的に、私にとって初めてのものです。あなたの答えは私が絵を手に入れるのを助けています。私は自分自身を最大のC++プログラマと考えていたわけではありませんでしたが、(純粋に)私はその言語を熟知していたと思いました。そのような新型が発見されたことはどれほど楽しいか。 – StoneThrow

+1

@StoneThrow:あまりにも多くの:)そしてほとんどがまったくばかげています。 –

+0

@StoneThrow:メンバータイプはC++標準ライブラリ全体で使用されています。 'std :: vector :: iterator'を見てください。 http://en.cppreference.com/w/cpp/container/vector – Jesin

関連する問題