2011-08-01 69 views
2

在下面的代碼中Node_Tstd::shared_ptr,element_type將是Node< T,U >,並且此類型的成員名爲root_;縮短嵌套變量名稱

有沒有辦法縮短這個:Node_T::element_type::root_只是root_

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

      Node_T::element_type::root_ = Node_T::element_type::root_->parent_; 

     } 

     return Node_T::element_type::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

好人,忘了你可以參考汽車!!! – 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_T::element_type::root_類型只是Node_T,因爲node類型是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

您在這裏製作了2個'node'副本(我們不知道'Node_T'的大小)並且通過'const'引用返回局部變量'tmp';可以是UB。 – iammilind

+0

@iammilind:從代碼中可以清楚的看出'node'實際上是一個指針,所以'Node_T tmp = node'不會創建任何內容副本。事實上,在你的代碼中'auto&root'是不需要的,因爲'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_一次。