将函数一般传递给c ++模板

时间:2016-11-15 18:16:15

标签: c++ templates

template<typename T, typename F>
auto mapV(vector<T> v, F f) {
    vector<T> ret = {};
    for(int i=0; i < v.size(); i++) {
        ret[i] = f(v[i]);
    }
    return ret;
}

int main () {
    vector<int> v = {1,2,3,4,5,6};
    vector<int> b = mapV(v, [](int &t){ return t*2; });
    for (int n : b) {
        cout << "is " << n << endl;
    }
    return 0;
}

此代码编译但运行时会生成段错误。一般使用模板接受函数的正确方法是什么?我也想定义函数的结构,可以说我只接受一个带T的函数并返回一个T,但我不太清楚如何表达它。

我尝试使用std::function<T(T)>,但这不起作用

1 个答案:

答案 0 :(得分:1)

vector<T> ret = {};

这会创建一个空矢量。

for(int i=0; i < v.size(); i++) {
    ret[i] = f(v[i]);

这会为向量ret中的值指定一些内容。向量ret中没有现有值。没有ret[0]。没有ret[1],依此类推。这是未定义的行为。 operator[]不会向向量添加新值,只会修改现有值。

将其替换为push_back()方法。