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是一个函数,而你想要一个ints 的向量:

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是生成器函数的类型,而不是生成器函数返回的类型。你正在创建一个这种类型的向量。因此出现错误,当您插入数组时,您试图将 aint返回的a 转换Generator为 a 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 回答