std::带有指向成员函数和back_inserter的指针的转换包装器

std::transform wrapper with pointer to member functionand back_inserter

本文关键字:inserter 指针 转换 包装 back 函数 成员 std      更新时间:2023-10-16

我为 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作为参数。