使用C ++模板函数和Generator类型

时间:2012-10-14 22:15:48

标签: c++ templates generator

我正在实现一个模板函数,它将参数迭代器指向的序列的前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'的无效转换”。你能看出我的模板功能出了什么问题吗?

3 个答案:

答案 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的另一个名称。签名和语义是相同的。