2011-08-01 19 views
2

Node_Tのコードではstd::shared_ptrelement_typeNode< T,U >、このタイプのメンバーはroot_です。ネストされた変数名の短縮

これをどうにか短縮する方法はありますか:Node_T::element_type::root_からちょうどroot_までですか?

+0

ここにはいくつかの 'typename'がありますか? – Puppy

+0

@DeadMGまあ、root_は型名ではなく、typenameは::の右にある型が型であることを示していると思うので、element_typeにtypenameが必要かどうかはわかりません。 – smallB

答えて

1

C++ 0xを使用している場合は、その後、機能root(Node_T&)の最初の行をすることができ、

auto &root_ = Node_T::element_type::root_; 
// use root_ now onwards 
+0

良い男は、あなたがrefを自動化できることを忘れてしまった! – smallB

+0

'Node_T&root_ = Node_T :: element_type :: root_;': –

+0

@ n.mと書くのはそれほど時間がかかりません。それは本当ですが、もし私がC++ 0xを使っているなら、私は 'auto'(または' decltype')を好むでしょう。 'Node_T'が' shared_ptr'でなく、 'class D'であると考えてください。これは他の 'クラスB 'の派生である。それを 'Node_T'(=' B')にすると、実際の型は黙って破棄されますが、 'auto'は' D '型を安全に保ちます。ちょっとした考え。 :) – iammilind

1

あなたのコード:

Node_T::element_type::root_ = node; 

上記のコードから、nodeの種類があるので、Node_T::element_type::root_の種類は、ちょうどNode_TようですNode_T 。もしそうなら、あなたは単に書く必要があります:

Node_T tmp = node; 
while (tmp->parent_) 
{ 
    tmp = tmp->parent_; 
} 
Node_T::element_type::root_ = tmp; 
return Node_T::element_type::root_; 
+0

'node'のコピーを2つ作っています(' Node_T'のサイズはわかりません)、 'const'リファレンスでローカル変数' tmp'を返しています。それはUBとすることができます。 – iammilind

+0

@ iammilind:コードから明らかに 'node'は実際にポインタなので、' Node_T tmp = node'はコンテンツのコピーを作成しません。実際、あなたのコードで 'auto&'は必要ないので、 'auto root'で十分です。 – Nawaz

+0

はい、あなたは正しいです。これは実際には 'shared_ptr <>'です。しかし私は、もし私たちが参考にしてローカルコピーを返すことができるかどうかはわかりません。私の答えでは、私はそれの余分なコピーを避けるために、私は参照を使用した。 – iammilind

0

ポインタについてはどうですか?

template<class Node_T> 
const Node_T& root(Node_T& node) 
    { 
     const Node_T * root_ = &node; 
     while (root_->parent_) 
     { 
      root_ = root_->parent_; 
     } 
     return Node_T::element_type::root_ = *root_; 
    } 

これは、Node_T::element_type::root_も1回だけ上書きします。

関連する問題