我为std :: transform创建了一个包装器,以便每次都不传递begin和end。
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
}
};
但这不起作用。我在这里错过了什么?签名中的东西?我如何使它工作?
答案 0 :(得分:3)
在您的示例中,&X::foo
是一个带有两个参数的函数:一个显式参数(std::string const&
)和一个隐式参数(X
)。但是您的transform()
希望一元可以调用。那里存在不匹配。
你需要&#34;绑定&#34; &X::foo
的隐式对象参数,使其变为一元。最简单的方法是使用lambda:
utils::transform(container, std::back_inserter(result),
[this](auto const& s) { return foo(s); });
您也可以使用std::bind()
...但是......不要
答案 1 :(得分:0)
您可以在第一个用法示例中使用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
作为参数。