从容器上的 lambda 调用推断模板类型

Deduce template type from lambda invocation on container

我有以下地图实现,它采用向量和 lambda 作为输入,returns 是一个新向量。

template <typename R, typename T, typename Predicate>
std::vector<R> map(const std::vector<T> &v, Predicate p) {
    std::vector<R> mapd(v.size());
    std::transform(v.begin(), v.end(), mapd.begin(), p);
    return mapd;
}

我是这样用的

std::vector<int> input{1, 2, 3};
auto result = map<float>(input, [] (const int &v) { return v * 2.0; }); // result should be vector<float>{2., 4., 6.}

这行得通,但我想看看是否可以在不在调用中指定的情况下推断出 R 模板类型。

现在,我知道我有 return 类型的 lambda 和输入向量的类型,有没有办法做到这一点?我试过使用 std::result_of_t<p(t)> 但一无所获。

你的意思如下?

template <typename T, typename Predicate, 
          typename R = decltype(std::declval<Predicate>()(std::declval<T>()))>
std::vector<R> map(const std::vector<T> &v, Predicate p) {
    std::vector<R> mapd(v.size());
    std::transform(v.begin(), v.end(), mapd.begin(), p);
    return mapd;
}

或者也许(如果你至少可以使用 C++14)

template <typename T, typename Predicate>
auto map(const std::vector<T> &v, Predicate p) {
    std::vector<decltype(p(v[0]))> mapd(v.size());
    std::transform(v.begin(), v.end(), mapd.begin(), p);
    return mapd;
}