通过非静态成员函数转换向量
Transform vectory by non-static member function
考虑这个模板函数:
template<class T, class F> inline
auto transform(const vector<T>& l, F func) -> vector<decltype(func(T{}))>
{
vector<decltype(func(T{}))> out(l.size());
std::transform(l.begin(), l.end(), out.begin(), func);
return out;
}
这个函数可以这样调用
auto out = transform(intputVector, functor)
仿函数必须是静态成员函数或全局函数。
有没有办法修改上述代码以使其也适用于非静态成员函数?
struct Test {
Test() {
vector<int> vx = { 1, 2, 3 };
auto vy1 = transform(vx, staticMemberFunc); // is fine
auto vy2 = transform(vx, memberFunc); // does not compile
}
flt memberFunc(int x) {
return 2 * x;
}
static flt staticMemberFunc(int x) {
return 2 * x;
}
};
是的,
- 使用
std::bind()
给你一个你可以传入的函子
- 使用 lambda 函数执行与 1 相同的操作。
您可以使用 lambda 来绑定对象指针:
auto vy2 = transform(vx, [this](int x){return this->memberFunc(x);});
考虑这个模板函数:
template<class T, class F> inline
auto transform(const vector<T>& l, F func) -> vector<decltype(func(T{}))>
{
vector<decltype(func(T{}))> out(l.size());
std::transform(l.begin(), l.end(), out.begin(), func);
return out;
}
这个函数可以这样调用
auto out = transform(intputVector, functor)
仿函数必须是静态成员函数或全局函数。
有没有办法修改上述代码以使其也适用于非静态成员函数?
struct Test {
Test() {
vector<int> vx = { 1, 2, 3 };
auto vy1 = transform(vx, staticMemberFunc); // is fine
auto vy2 = transform(vx, memberFunc); // does not compile
}
flt memberFunc(int x) {
return 2 * x;
}
static flt staticMemberFunc(int x) {
return 2 * x;
}
};
是的,
- 使用
std::bind()
给你一个你可以传入的函子 - 使用 lambda 函数执行与 1 相同的操作。
您可以使用 lambda 来绑定对象指针:
auto vy2 = transform(vx, [this](int x){return this->memberFunc(x);});