2

イテレータと基準のペアを取るアルゴリズムを宣言したいと思います。次に、基準を満たす反復子の範囲から項目のベクトルを返します。

template <typename TIterator, typename TCriterium>
std::vector< Type that I will get after dereferencing TIterator >
filter (TIterator begin, TIterator end, TCriterium passes);

decltype や auto などの C++11 機能を使用できます。私は試した:

#include <vector>

template <typename TIterator, typename TCriterium>
auto filter (TIterator begin, TIterator end, TCriterium passes) 
                      -> std::vector< decltype(*begin) >
{
}

int main()
{
    std::vector<int*> vector;
    filter(vector.begin(), vector.end(), 0);
    return 0;
}

しかし、これはうまくいきません。私は得る:

/usr/include/c++/4.7/ext/new_allocator.h:59: 
error: forming pointer to reference type 'int*&'
4

5 に答える 5

6

あなたが使用することができます:

std::vector<typename std::iterator_traits<TIterator>::value_type>

関数の戻り値の型として、次のようになります。

#include <vector>
#include <iterator>

// ...

template <typename TIterator, typename TCriterium>
std::vector<typename std::iterator_traits<TIterator>::value_type> filter(
    TIterator begin, TIterator end, TCriterium passes)
{
    // Body...
}

道に進みたい場合は、次のdecltypeことができます。

#include <vector>
#include <type_traits>

// ...

template <typename TIterator, typename TCriterium>
auto filter (TIterator begin, TIterator end, TCriterium passes)
    -> std::vector< typename std::decay<decltype(*begin)>::type >
{
}
于 2013-05-08T12:15:53.933 に答える
1

std::vector<typename std::iterator_traits<TIterator>::value_type>または場合によってはを使用しますstd::vector<typename std::decay<decltype(*begin)>::type>。私は前者の方が好きです。

于 2013-05-08T12:16:49.537 に答える
1

型を操作するためのstd::remove_referenceと type_traits ヘッダーを見ているかもしれません

于 2013-05-08T12:16:16.967 に答える