2

スキップする要素の数のテンプレートパラメーターを使用して、単純な「スキップイテレーター」を作成しようとしています。

template <typename T, typename Iter, int Skip>
class SkipIterator
{
public:
    SkipIterator(Iter baseIter) :
        baseIter_(baseIter)
    {
    }

    void operator++()
    {
        baseIter_ += Skip;
    }

    T &operator*()
    {
        return *baseIter_;
    }

private:
    Iter baseIter_;
};

Iter次のようなベースとTタイプを推測できるようにしたいと思います。

std::vector<double> dataFromSomewhere;
SkipIterator<3> skipper(dataFromSomewhere.begin())

しかし、コンパイラ (VS2010) は「テンプレート引数が少なすぎます」というエラーを出します。

これを行う方法はありますか?

4

2 に答える 2

8

ヘルパー関数を提供できます:

#include <iterator>

template <int Skip, typename Iter>
SkipIterator<typename std::iterator_traits<Iter>::value_type, Iter, Skip> 
    make_skip_iterator(Iter it)
{
    return SkipIterator<
        typename std::iterator_traits<Iter>::value_type, Iter, Skip
        >(it);
}

このように使用します:

std::vector<double> dataFromSomewhere;
auto skipper = make_skip_iterator<3>(dataFromSomewhere.begin());

これが実際のです。

上記のヘルパー関数の C++14 バージョンは、戻り値の型推定のおかげで (少なくとも署名では) 見栄えがよくなることに注意してください。

template <int Skip, typename Iter>
auto make_skip_iterator(Iter it)
{
    return SkipIterator<
        typename std::iterator_traits<Iter>::value_type, Iter, Skip
        >(it);
}

そしてもちろんライブの例。

于 2013-07-15T22:02:17.030 に答える
6

テンプレート パラメーターの推論は、テンプレート関数呼び出しでのみ発生し、クラス テンプレート名を含む変数宣言では発生しません。また、すべてではなく一部のパラメータを推定したい場合は、推定したいパラメータが最後にある必要があります。

全体として、次のようなものを探しています。

template <int Skip, typename Iter>
auto make_skipper(Iter it)->SkptIterator<decltype(*it), Iter, Skip> {
  return SkptIterator<decltype(*it), Iter, Skip>(it);
}

auto skipper = make_skipper<3>(dataFromSomewhere.begin());
于 2013-07-15T22:02:42.750 に答える