【发布时间】:2019-11-10 10:28:15
【问题描述】:
我想在 C++ 中模仿 Ruby 的 map() 方法。我正在努力自动找出返回类型:
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
typedef std::string T2;
template<class T1,
// class T2, // gives "couldn't deduce template parameter 'T2'"
class UnaryPredicate>
std::vector<T2> map(std::vector<T1> in, UnaryPredicate pred)
{
std::vector<T2> res(in.size());
std::transform(in.begin(), in.end(), res.begin(), pred);
return res;
}
int main()
{
std::vector<int> v1({1,2,3});
auto v2(map(v1, [](auto el) { return "'"+std::to_string(el+1)+"'"; }));
std::cout << v2[0] << "," << v2[1] << "," << v2[2] << std::endl;
}
这样编译,但T2 固定为string。如果我使用另一个T2 定义,编译器会抱怨couldn't deduce template parameter 'T2'。
我也尝试过使用std::declval,但可能不是正确的方式——我无法解决问题。
【问题讨论】:
-
欢迎来到 Stack Overflow!仅供参考,请注意主函数的正确签名是
int main()。 -
模仿
map不一定是个好主意,因为我们有范围。ranges::view::transform是惯用且高效的,如果您需要副本而不是视图,只需复制视图即可。 -
@ruohola 这并非不可能,但很可能是遗留的implicit-int 规则启动了。一些编译器仍然默认实现它。例如,请参阅implicit int and implicit declaration of functions with gcc compiler。
标签: c++ templates lambda template-argument-deduction generic-lambda