std::带有指向成员函数和back_inserter的指针的转换包装器
std::transform wrapper with pointer to member functionand back_inserter
我为 std::transform 创建了一个包装器,以便每次都不传递 begin 和 final。
template <typename C, typename C2, typename UnaryOperation>
void transform(const C& c1, C2& result, const UnaryOperation& up)
{
std::transform(std::begin(c1), std::end(c1), std::begin(result), up);
}
我可以这样使用
utils::transform(container, result, [](const auto& o) {return doSometing;});
我想要另一个签名,我可以做类似的事情
struct X {
Object foo(std::string const& ) const;
void bar(std::vector<std::string> const& container) const
{
std::vector<Object> result;
utils::transform(container, std::back_inserter(result), &X::foo);
// do something with result
}
};
但这行不通。我在这里错过了什么?签名中有什么东西?我如何让它工作?
在您的示例中,&X::foo
是一个接受两个参数的函数:一个显式参数(std::string const&
(和一个隐式参数(X
(。但是你的transform()
想要一个一元可赎回的。那里有不匹配。
您需要将隐式对象参数"绑定"到&X::foo
,以便它成为一元。最简单的方法是使用 lambda:
utils::transform(container, std::back_inserter(result),
[this](auto const& s) { return foo(s); });
您也可以使用std::bind()
...但。。。不要。
您可以使用 lambda,就像在第一个使用示例中一样。
Object object;
auto lambda_for_member_myFunction = [object](const auto& o) {
return object.myFunction(o);
};
utils::transform(container, std::back_inserter(result), lambda_for_member);
现在,您可以将其包装在另一个帮助程序中,但仍需要添加object
作为参数。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错