C++ std::带有指向成员函数和back_插入器的指针的转换包装器
我为std::transform创建了一个包装器,使其每次都不传递begin和endC++ std::带有指向成员函数和back_插入器的指针的转换包装器,c++,c++14,std,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(r
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);
}
我想要另一个签名,我可以这样做
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
}
};
struct X{
对象foo(std::string const&)const;
空条(标准::向量常量和容器)常量
{
std::向量结果;
utils::transform(容器、std::back\u插入器(result)和X::foo);
//做一些有结果的事情
}
};
但这不起作用。我错过了什么?签名里有什么?如何使其工作?您可以像第一个使用示例一样使用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);
现在,您可以将其包装到另一个帮助器中,但仍然需要添加
对象
作为参数 在您的示例中,&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()
。。。但是不需要。您还需要为对象传递this
,而不仅仅是成员函数指针。@CaptainGiraffe关于std::mem\u fn
?您还需要在那里传递object/this。即使使用auto f=std::bind(std::mem\u fn(&object::func)),这也可以在调用utils::transform(container,,&Object::myFunction)
时,将f
作为最后一个参数传递给std::transform不会编译。。。此处的容器
包含要调用myFunction
的对象
s,对吗?std::bind(&Object::member\u func,this,std::placeholder::\u 1)代码>应该可以工作,但它不太容易使用。std::begin(std::back\u inserter(result))
仍然无效。@Jarod42我正在使用C2&&
并将std::begin(result)
替换为std::forward
utils::transform(container, std::back_inserter(result),
[this](auto const& s) { return foo(s); });