std::function 模板参数推导

std::function template argument deduction

我已经为我当前的问题创建了一个示例。 我希望能够在不指定模板类型的情况下调用以下函数,因为编译器应该能够找出类型:

template<typename T, class Iterable>
void foreach1(std::function<void(T&)> action, Iterable& iterable) {
    std::cout << typeid(T).name() << std::endl;
    for (auto& data : iterable)
        action(data);
}

如果我这样调用函数:

std::vector<int> a = { 1, 2, 3 };
foreach1([](int& data) {
    std::cout << data << std::endl;
}, a);

我收到一个错误。我知道我可以通过以下方式用模板替换 std::function 来解决问题:

template<class Action, class Iterable>
void foreach2(Action action, Iterable& iterable) {
//std::cout << typeid(T).name() << std::endl; // no access to T
for (auto& data : iterable)
    action(data);
}

但是这样做我就失去了对类型 T 的访问权限。 有没有办法保持对类型 T 的访问并能够使用模板参数推导?

将参数传递给其类型取决于推导的模板参数的参数时,不允许隐式转换。

我建议使用第二个选项:

template<class Action, class Iterable>
void foreach2(Action action, Iterable& iterable)

并确定 T,首先从 action 中制作 std::function

std::function(action)

然后写一个模板获取a的参数类型 std::function:

template <typename T> struct std_func_param {};
template <typename R, typename T> struct std_func_param<std::function<R(T)>> {using type = T;};
template <typename T> using std_func_param_t = typename std_func_param<T>::type;

这样使用:

using T = std_func_param_t<decltype(std::function(action))>;