4

私は一種のコンテナであるクラスを作成しています. std::vector やその他の標準コンテナのような「最初」と「最後」のイテレータを取ることができるコンストラクタを作成したいと思います. 正しい構文は何ですか? (テンプレートには、利用可能な最初/最後のイテレータタイプを取得できる関数が必要です(私が思う標準ライブラリのように)。どうもありがとうございました!

例として、私はそのようなものが欲しい:

template<class ...> MyClass(... first, ... last) 

しかし、... とは何ですか?

どうもありがとうございました。

最初の答えについて:イテレータを引数として取る特定のコンストラクタが必要です(値とポインタを引数として取るコンストラクタがすでにあるため)

編集:このようなものは大丈夫ですか?

template<class T1, class T2> MyClass(std::iterator<T1, T2> first, std::iterator<T1, T2> last)
4

2 に答える 2

6

これ...は、タイプが何であれ、単なるプレースホルダー名です。あなたは 良い 本を 読む 必要 が ある と 思い ます.

template<class Iter> MyClass(Iter first, Iter last)

Iter型が反復子を表す必要がある場合は、共通名です。もう 1 つのオプションはInIt、イテレータを出力イテレータにしてはならないことを通知することです。

于 2012-05-27T01:10:13.793 に答える
3

std::iteratorというメンバーがいることを活かして、やりたいことができると思いますiterator_category。これをSFINAEと組み合わせると、次のようなものが得られます。

#include <iostream>
#include <vector>

template <class X>
class my_class {
public:
    my_class(X a, X b) {
        std::cout << "in my_class(X,X)" << std::endl;
    }

    template <class Iter>
    my_class(Iter a, Iter b, typename Iter::iterator_category *p=0) {
        std::cout << "in my_class(Iter,Iter)" << std::endl;
    }
};

int
main()
{
    char buf[] = "foo";
    std::vector<char> v;

    my_class<int> one(1, 2);
    my_class<char*> two(&buf[0], &buf[3]);
    my_class<char> three(v.begin(), v.end());

    return 0;
}

これは以下を出力します:

in my_class(X,X)
in my_class(X,X)
in my_class(Iter,Iter)
于 2012-05-27T01:44:11.160 に答える