gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:20:04 25 4
gpt4 key购买 nike

我为 std::transform 创建了一个包装器,以便每次都不会同时传递开始和结束。

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() 想要一个 unary 可调用对象。那里不匹配。

您需要将隐式对象参数“绑定(bind)”到 &X::foo 以便它成为一元的。最简单的方法是使用 lambda:

utils::transform(container, std::back_inserter(result),
[this](auto const& s) { return foo(s); });

您也可以使用 std::bind()...但是...不要。

关于c++ - std::transform 包装器,带有指向成员函数和 back_inserter 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50167393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com