Node_T
のコードではstd::shared_ptr
、element_type
はNode< T,U >
、このタイプのメンバーはroot_
です。ネストされた変数名の短縮
これをどうにか短縮する方法はありますか:Node_T::element_type::root_
からちょうどroot_
までですか?
Node_T
のコードではstd::shared_ptr
、element_type
はNode< T,U >
、このタイプのメンバーはroot_
です。ネストされた変数名の短縮
これをどうにか短縮する方法はありますか:Node_T::element_type::root_
からちょうどroot_
までですか?
C++ 0xを使用している場合は、その後、機能root(Node_T&)
の最初の行をすることができ、
auto &root_ = Node_T::element_type::root_;
// use root_ now onwards
良い男は、あなたがrefを自動化できることを忘れてしまった! – smallB
'Node_T&root_ = Node_T :: element_type :: root_;': –
@ n.mと書くのはそれほど時間がかかりません。それは本当ですが、もし私がC++ 0xを使っているなら、私は 'auto'(または' decltype')を好むでしょう。 'Node_T'が' shared_ptr'でなく、 'class D'であると考えてください。これは他の 'クラスB 'の派生である。それを 'Node_T'(=' B')にすると、実際の型は黙って破棄されますが、 'auto'は' D '型を安全に保ちます。ちょっとした考え。 :) – iammilind
あなたのコード:
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_;
'node'のコピーを2つ作っています(' Node_T'のサイズはわかりません)、 'const'リファレンスでローカル変数' tmp'を返しています。それはUBとすることができます。 – iammilind
@ iammilind:コードから明らかに 'node'は実際にポインタなので、' Node_T tmp = node'はコンテンツのコピーを作成しません。実際、あなたのコードで 'auto&'は必要ないので、 'auto root'で十分です。 – Nawaz
はい、あなたは正しいです。これは実際には 'shared_ptr <>'です。しかし私は、もし私たちが参考にしてローカルコピーを返すことができるかどうかはわかりません。私の答えでは、私はそれの余分なコピーを避けるために、私は参照を使用した。 – iammilind
ポインタについてはどうですか?
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回だけ上書きします。
ここにはいくつかの 'typename'がありますか? – Puppy
@DeadMGまあ、root_は型名ではなく、typenameは::の右にある型が型であることを示していると思うので、element_typeにtypenameが必要かどうかはわかりません。 – smallB