48

テンプレートをtypedef'ing' するための命名規則を切り替えています。boost::shared_ptr例えば:

typedef boost::shared_ptr<Foo> FooPtr;

規約を決める前に、他の人が何を使っているか見てみたい。あなたのコンベンションは何ですか?

編集:

typedef内部をネストしている人は、それがどのように渡されるかを「認識」しているFooことが気になりませんか? Fooカプセル化を破るようです。これはどう:

class Foo
{
public:
    typedef std::vector<Foo> Vector;
};

あなたは今これをしないでしょうね?:-)

4

16 に答える 16

27

答え: しないでください。あなただけでなく、誰にとっても便利です。あなたの言いたいことを言ってください。

于 2010-04-27T00:06:12.800 に答える
15

私の好み:

class Foo
{
public:

    typedef boost::shared_ptr<Foo> SharedPointer;
};

just の問題FooPtrは、さまざまなタイプのポインター ( weak_ptrs など) を使用できることです。略語もあまり気にしませんが、それはまったく別の問題です。

于 2010-04-26T22:44:09.947 に答える
5

個人的には、私が担当しているコードでは、通常、Foo同じ名前空間スコープで FooPtr の typedef が表示され、 Foo には FooPtr と同じ型の一般的な名前の「SmartPtr」typedef が含まれます。FooPtr を使用すると、冗長でない手動の使用が簡単になります。「SmartPtr」またはそれに相当するものに対してネストされた typedef を使用すると、スマート ポインターの実際の型を知らなくても、テンプレートやマクロなどで簡単にジェネリックを使用できます。

また、この質問に「主観的」タグを追加することをお勧めします。

于 2010-04-27T01:39:36.143 に答える
4

私は外部とカプセル化されたtypedefの両方を使用しましたが、最初の、

typedef boost::shared_ptr<Foo> FooPtr; 

組み合わせた式では、これが。よりもきれいに見えるからですFoo::Ptr

Fooがどのように渡されるかを「認識」しているのは気になりませんか?

多くの場合、これらのクラスはファクトリメソッドを介してのみ作成できます。

struct Foo
{
     static FooPtr Create() { return FooPtr(new Foo); }

   protected:
     Foo() {}
}

これは、typedefをカプセル化するよりも「強力」ですが、非常に一般的なパターンです。

于 2010-04-26T23:09:49.327 に答える
3

私は一般的に非常に短い識別子のファンではありませんが、これは私がそれらを使用する1つのケースです。

class Foo
{
public:
    typedef std::shared_ptr<Foo> p;
};

これにより、shared_ptrは、混乱のリスクなしに、通常のポインターに可能な限り類似することができます。

Foo* myFoo;
Foo::p myFoo;

また、カプセル化を解除することに関しては、いいえ、クラス内でshared_ptr型を型定義しても、クラス外で型定義する以上にカプセル化を解除することはありません。「カプセル化」のどのような意味に違反しますか?あなたはFooの実装について何も明らかにしていません。タイプを定義しているだけです。これは、Foo*とFooの関係に完全に類似しています。Foo *は、Fooへの特定の種類のポインターです(デフォルトの種類です)。Foo::pはFooへの別の種類のポインタです。カプセル化を破るのではなく、型システムに追加するだけです。

于 2011-10-21T18:07:31.833 に答える
2

私はハンガリーの命名規則の大ファンではありません。通常は次のように使用します。

typedef boost::shared_ptr<Foo> FooSharedPtr;

明確にするのに十分なほど詳細ですが、大きな面倒にならないように十分に短くなっています。いずれにせよ、特に将来その型を使用するのがあなただけではない場合は、特に共有ポインターであることを明確に示します。

于 2010-04-26T22:58:41.723 に答える
2

typedef私は通常、クラス内にカプセル化します。boost::shared_ptrその理由は、メモリに依存するコードがいくつかあり、それによってとを簡単に切り替えることができるからです。boost::intrusive_ptr これintrusive_ptrは、クラスがサポートする必要があるものであるため、使用する共有ポインタをクラス。

于 2010-04-26T23:37:28.923 に答える
1

私の最初の応答は、「なぜそれをtypedefするのか」と尋ねることです。

あなたの編集への返信:実際、それは多くの状況で役立つ可能性のあるかなり興味深いアプローチです。それを使用して、元の質問に戻ることができます。


struct object
{
  typedef object* ptr_t;
  typedef shared_ptr<object> shared_ptr_t;
  typedef weak_ptr<object> weak_ptr_t;
  typedef unique_ptr<object> unique_ptr_t;
  etc...
}
于 2010-04-26T23:27:35.387 に答える
1
  typedef shared_ptr<Foo> sptr_Foo;
  typedef weak_ptr<Foo>   wptr_Foo;
  typedef unique_ptr<Foo> uptr_Foo;
于 2015-04-01T14:51:34.323 に答える
0

これは、私がすぐに同意した慣習の 1 つです。

typedef boost::shared_ptr<Foo> FooProxy;

...これはProxyパターンboost::shared_ptrのアプリケーションです。

于 2010-04-26T23:13:18.623 に答える
0

で終わるといいですね_t

class Bar
{
public:
    typedef boost::shared_ptr<Bar> Ptr_t;
};
于 2010-04-26T22:50:20.300 に答える
0

どうですか:

template <typename T>
class Shared
{
    public: 
        typedef std::shared_ptr<T> Ptr; // or boost::shared_ptr if you will
};

次に、次のように、任意のSharedクラスが独自の Ptr オブジェクトを持つことを許可します。

class myClass : public Shared<myClass>
{
};

int main()
{
    myClass::Ptr object;
    //...
    object->foo();
}
于 2015-02-16T08:41:19.323 に答える
0
class foo;

typedef boost::shared_ptr<foo> foo_p;
typedef boost::weak_ptr<foo> foo_wp;
于 2012-03-20T14:22:11.083 に答える