从容器上的 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;
}
我有以下地图实现,它采用向量和 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;
}