我正在实现一个模板函数,它将参数迭代器指向的序列的前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'的无效转换”。你能看出我的模板功能出了什么问题吗?
答案 0 :(得分:1)
矢量的类型错误:
std::vector<Generator> vec;
在这里,Generator
是一个函数,你想要一个int
s的向量:
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;
}
答案 1 :(得分:1)
嗯,Generator
是生成器函数的类型,而不是生成器函数返回的类型。而你正在创建这种类型的矢量。因此错误,当您插入数组时,您尝试将int
返回的Generator
转换为int(*)()
。
但是你为什么不直接插入secuence,而不是通过向量?
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;
}
答案 2 :(得分: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
的另一个名称。签名和语义是相同的。