首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用模板化的std::function作为参数?

如何使用模板化的std::function作为参数?
EN

Stack Overflow用户
提问于 2020-02-09 10:28:18
回答 2查看 38关注 0票数 0

我想为2D-vector创建for_each函数,但有一个错误:

代码语言:javascript
复制
error: no matching function for call to ‘each(std::vector<std::vector<int> >&, main()::<lambda(int&)>)’

我怎么才能修复它?

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <functional>
using namespace std;

template <class VarType>
void each(vector<vector<VarType>> &ve, function<void (VarType &)> action) {
    for(vector<VarType> &v : ve) {
        for(VarType &p : v) {
            action(p);
        }
    }
}

int main() {
    vector<vector<int>> map(5);
    for(vector<int> &ve : map) {
        ve.resize(4);
    }

    each(map, [](int &val) {
        val = 1;
    });
}
EN

回答 2

Stack Overflow用户

发布于 2020-02-09 10:39:34

这里有几个解决方案。我建议只为函数使用单独的模板参数:

代码语言:javascript
复制
template <class VarType, class Function>
void each(vector<vector<VarType>> &ve, Function action) {
   // no more worries
}

问题是编译器无法从传递的lambda中找出function<void (VarType&)>中的VarType。这样做:

代码语言:javascript
复制
function<void(int&)> action = [](int &val) {
    val = 1;
};
each(map, action);

也是可行的,因为这样类型(int&)是已知的。

附注:在C++17中,你可以使用std::function action = [](int &val) { val = 1; };

票数 5
EN

Stack Overflow用户

发布于 2020-02-09 10:54:20

虽然我认为像@DeiDei建议的那样将函数作为另一个模板参数是更好的解决方案,但这里有一个替代方案:

如果希望从第一个函数参数推导出VarType,则可以将第二个参数设为非推导的上下文:

代码语言:javascript
复制
template <class VarType>
void each(vector<vector<VarType>> &ve,
  typename type_identity<function<void (VarType &)>>::type action) {
    for(vector<VarType> &v : ve) {
        for(VarType &p : v) {
            action(p);
        }
    }
}

这需要用于std::type_identity#include<type_traits>的C++20,但您可以轻松实现自己的type_identity

代码语言:javascript
复制
template<typename T>
struct type_identity {
    using type = T;
};

这之所以有效,是因为留给作用域解析操作符::的所有内容都是一个非推导的上下文,这意味着其中的模板参数不会从该函数参数中推导出来。原始函数的模板参数推导失败,因为无法从第二个参数推导出VarType,因为调用中给出的第二个函数参数实际上并不具有std::function<...>类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60133000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档