0

パラメータイテレータが指すシーケンスの最初のn個の要素の値を、ジェネレータ関数の呼び出しによって返される値に設定するテンプレート関数を実装しています。

私は次のコードを持っています:

template <typename IteratorOut, typename SizeType, typename Generator> IteratorOut createSequence(IteratorOut out, SizeType n, Generator gen) {
    std::vector<Generator> vec;
    for (SizeType i = 1; i <= n; i++) {
        vec.push_back(gen());
    }
    std::copy(vec.begin(), vec.end(), out);

    return out;
}

私は次のように関数をテストしています:

int generate () {
    return 5;
}
...
std::vector<int> vec_int;

createSequence(vec_int.begin(), 5, generate);
for (std::vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end(); iter++) {
    std::cout << *iter << std::endl;
}

「エラー:'int(*)()'から'int'への無効な変換」が発生します。テンプレート関数の何が問題になっているのかわかりますか?

4

3 に答える 3

1

ベクトルのタイプが間違っています:

std::vector<Generator> vec;

ここに、は関数があり、代わりGeneratorにsのベクトルが必要です。int

std::vector<SizeType> vec; // SizeType is an euphemism for int

しかし、おそらくあなたはベクトルをまったく必要としないでしょう!

for (SizeType i = 1; i <= n; i++) {
    *out = gen(); // is this what you want?
    ++out;
}
于 2012-10-14T22:34:21.507 に答える
1

さて、Generatorジェネレーター関数によって返されるタイプではなく、ジェネレーター関数のタイプです。そして、あなたはそのようなタイプのベクトルを作成しています。したがって、エラーは、配列に挿入するときに、intによって返されたをに変換しようとしGeneratorていint(*)()ます。

しかし、ベクトルを通過するのではなく、単にセキュリティに直接挿入してみませんか?

template <typename IteratorOut, typename SizeType, typename Generator> 
IteratorOut createSequence(IteratorOut out, SizeType n, Generator gen) {
    for (SizeType i = 0; i < n; i++)
       *out++ = gen();
    return out;
}
于 2012-10-14T22:37:01.380 に答える
1

実際、そのアルゴリズムはすでに標準ライブラリに存在しています。一時的なベクトルは使用しないでください。ただし、ループも使用しないでください。使用std::generate_n

template <typename IteratorOut, typename SizeType, typename Generator>
IteratorOut createSequence(IteratorOut out, SizeType n, Generator gen) {
    std::generate_n(out, n, gen);
    return out;
}

実際、C ++ 11では、これは次のように書き直すことができます。

template <typename IteratorOut, typename SizeType, typename Generator>
IteratorOut createSequence(IteratorOut out, SizeType n, Generator gen) {
    return std::generate_n(out, n, gen);
}

…言い換えれば、あなたの関数は単なる別名ですstd::generate_n。署名とセマンティクスは同じです。

于 2012-10-14T22:47:18.650 に答える