通过非静态成员函数转换vectory

时间:2015-02-16 10:39:57

标签: c++ templates

考虑这个模板功能:

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

2 个答案:

答案 0 :(得分:4)

您可以使用lambda绑定对象指针:

auto vy2 = transform(vx, [this](int x){return this->memberFunc(x);});

答案 1 :(得分:2)

是,

  1. 使用std::bind()为您提供一个可以传递的仿函数
  2. 使用lambda函数执行与1相同的操作。