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

时间:2018-05-04 04:54:46

标签: c++ c++14 std

我为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
    }
};

但这不起作用。我在这里错过了什么?签名中的东西?我如何使它工作?

2 个答案:

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