【发布时间】:2018-11-06 07:50:29
【问题描述】:
我的函数模板有问题。
我有 3 个不同的集合,并且我有集合的迭代器。现在我必须创建一个函数模板 'apply' 它将执行以下操作: 1.遍历集合的所有元素,检查谓词是否为真:
1.1 如果谓词返回 true - 则需要使用 lambda 'passed'
更改集合元素1.2 if predicate return false = then 集合元素需要用 lambda 改变 'rejected'
请给我一个例子,我应该怎么写。
非常感谢您的帮助。此处更新代码:
#include <iostream>
#include <vector>
#include <list>
#include <functional>
using namespace std;
template<typename T>
void apply(T collBegin, T collEnd, function<bool(int)> f1, function<int(int)> f2, function<int(int)> f3)
{
for (T actualPosition = collBegin; actualPosition != collEnd; ++actualPosition) {
if (f1(*actualPosition)) {
//the argument matches the predicate function f1
*actualPosition = f2(*actualPosition);
}
else {
//the argument doesn't match the predicate function f1
*actualPosition = f3(*actualPosition);
}
}
}
int main()
{
int arr[]{ 1,2,3,4,5,6,7,8,9 };
auto predicate = [](int arg) -> bool { return arg % 2 == 0; };
auto passed = [](int arg) -> int { return arg / 2; };
auto rejected = [](int arg) -> int { return (3 * arg) + 1; };
apply(arr, arr + std::size(arr), predicate, passed, rejected);
std::vector<int> vec(arr, arr + std::size(arr));
apply(vec.begin(), vec.end(), predicate, passed, rejected);
std::list<int> lis(vec.begin(), vec.end());
apply(lis.begin(), lis.end(), predicate, passed, rejected);
for (auto e : lis) std::cout << e << " ";
std::cout << '\n';
}
此代码有效。但我想将它从 int 更改为 T。我该怎么做?
【问题讨论】:
-
stackoverflow.com 上的所有问题都必须以纯文本形式包含问题本身中的所有相关信息。指向外部网站的可疑链接,可能随时停止工作,使问题变得毫无意义,是不可接受的。
-
我更正了这个。很抱歉。
-
您的一个 lambda 与其他的不同。然而,您声明它们的
std::function类型是相同的。有你的问题。此外,向量迭代器不是普通指针,因此尝试将它们用作T *也不会起作用。 -
Sooo 代码应该是什么样子的?你能写一个例子吗?
-
小心:有一个
std::apply。它可能还没有发生,但你最终可能会不小心调用它,或者至少当它出现在错误消息中时会感到困惑。这就是为什么你不应该写using namespace std;它将适用于一切。
标签: c++ c++11 templates lambda std-function