将函数绑定到一个范围以生成一个迭代函数
我正在尝试实现我自己的可以绑定范围的
bind_range
。它应该允许这样的客户端代码:
void f(int x, int y)
{
std::cout << x + y << ',';
}
std::vector<int> v1; // contains 1,2,3
void go()
{
boost::function<void(int y)> f_bound = bind_range(f, v1, _1);
f_bound(10); // prints 11,12,13,
}
在上面的代码中,我的模板bind_range
检测到v1
符合ForwardRangeConcept<>
,并且其值类型与f()
的第一个参数兼容。然后它生成一个函数对象,它将迭代v1
,为每个值调用f()
。
我知道上面的内容可以通过调用代码中的某种形式的for-each构造来实现,但我想采用绑定函数并在以后使用它。
以上是我想要实现的目标。我已经阅读了我的C ++模板元编程副本并查看了boost::bind
实现,但我无法开始使用解决方案。我也有一种唠叨的感觉,这种类似的东西已经存在于Boost库的某个地方。
扩展:
绑定多个范围。例如:
std::vector<int> v10; // contains 10,20,30
void go_multiple()
{
boost::function<void()> f_bound = bind_range(f, v10, v1);
f_bound(); // prints 11,12,13,21,22,23,31,32,33,
}
处理退货类型。我不需要迭代调用的返回类型,但可以想象某人可能想要存储或处理每个返回值。我确信这可以用某种Lamda型结构整齐地完成。
没有找到相关结果
已邀请:
3 个回复
献导外拘
和
复制,例如:
这很简单。您只需要创建一个模板化仿函数
,其中包含一个带有绑定信息的构造函数(即容器和仿函数)和一个将该函数应用于容器的
。 但请注意,保存这样的仿函数以供以后使用通常很危险,因为
对象最终可能会引用不再存在的容器。 一个简单的例子:
惜堡沁戚
樊熄忙暖