0

この情報は、実装の内部を詳しく調べることで得られると思います<list>。それが、私が最終日に行ったことです。

私の問題は、template<class T>(プライベートstd::list<T>メンバーを持つ)メソッドをラップしたいということです...しかし、このメソッドにどの戻り値が返されるかわかりません。

私のコードは次のようになります。

template &lt;class T &gt;
    class MyTemplate {
       std::list&lt;T&gt; myList;
       ...

       somereturnvaluehere myMethod(){
              return myList.begin();       
       }
       ...

}
4

5 に答える 5

8

どちらかです

  • typename std::list<T>::iterator, (非 const バージョン)
  • またはtypename std::list<T>::const_iterator(const バージョン)

オブジェクトかどうかによって異なりますが、あなたの場合myListはオブジェクトconstではないようですconst。つまり、最初のバージョンである非 const バージョンを使用する必要があります。

C++11 では、それについて心配する必要はありません。必要に応じて、末尾の戻り型を次のように使用できます。

auto myMethod() -> decltype(myList.begin())
{
    return myList.begin();       
}

しかし、あなたの場合、これはやり過ぎであり、実際には、必要以上に物事を不必要に複雑にしていると思います。したがって、使用しないことをお勧めします。ただし、C++11 には末尾の戻り型と呼ばれるものがあることを知っておいてください。その使用は、場合によっては正当化される可能性があります。

于 2012-05-22T14:24:30.407 に答える
7

リストbeginはを返しますstd::list<T>::iterator

あなたの場合、それは依存型になるのでsomereturnvaluehere

typename std::list<T>::iterator
于 2012-05-22T14:22:41.833 に答える
3

どちらかです

std::list<T>::iterator;

また

std::list<T>::const_iterator;

あなたのリストがそうであるかどうかに応じてconst。次のようにクラスでタイプを使用できます。

struct Foo {
    typedef typename std::list<SomeType>::iterator iterator;
    typedef typename std::list<SomeType>::const_iterator const_iterator;

    iterator foo() { return m_list.begin();}
    const_iterator foo() const { return m_list.begin(); }

    std::list<SomeType> m_list;
};
于 2012-05-22T14:23:46.863 に答える
1

std::list<T>::begin()他の人が言っstd::list<T>::iteratorたように、またはのいずれかを返します。std::list<T>::const_iterator

おそらくもっと重要なのは、関数から何を達成しようとしているのかということです。myMethod()

単にaの周りに薄いラッパーを記述している場合std::listは、値が表示されるかどうかわかりません。理想的には、クラス内にリストをカプセル化して、その実装が公開されないようにします。

于 2012-05-22T14:30:31.227 に答える
1

他の人が言ったように、それはでしょうstd::list<T>::iterator。しかし、よりクリーンな API を提示し、将来これを柔軟に変更できるようにするために、独自の typedef ( にマップされるstd::list<T>::iterator) を定義し、それを戻り値の型として使用することをお勧めします。すなわち:

template <class T >
    class MyTemplate {
       std::list<T> myList;
       typedef std::list<T>::iterator iterator;
       ...

       iterator myMethod(){
              return myList.begin();       
       }
       ...

}

ここでは、typedef に just という名前を付けました。これは、クラスのユーザーが--iteratorとして参照することを意味しますが、クラスの内容と詳細によっては、より具体的な名前を付けたい場合があります。MyTemplate<T>::iteratormyMethod()

を使用することにより、typedef後で気が変わってstd::vectorではなくを使用することに決めた場合std::list、ユーザーのコードを変更する必要はありません (もちろん、再コンパイルする必要があります)。

于 2012-05-22T14:42:21.037 に答える