【问题标题】:Using C++ template function with Generator type使用具有生成器类型的 C++ 模板函数
【发布时间】:2012-10-14 22:15:48
【问题描述】:

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

【问题讨论】:

  • 您确定您的错误信息吗?我反过来理解:“错误:从‘int’到‘int (*)()’的无效转换”。顺便说一句,您使用的是哪个编译器?

标签: c++ templates generator


【解决方案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;
}

【讨论】:

  • 是的,这就是我想要的,我误解了生成器类型。谢谢!
【解决方案2】:

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

【讨论】:

  • 是的,这就是我想要的,我误解了生成器类型。谢谢!
【解决方案3】:

实际上,该算法已经存在于标准库中。不要使用临时向量,但也不要使用循环。使用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 的另一个名称。签名和语义相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多