【发布时间】:2022-01-02 06:09:02
【问题描述】:
我来函数式编程有点晚了,并开始关注范围/视图。我正在使用 MSVC19 并为 C++ 20 进行编译。
我正在使用std::views::transform,编译器似乎并没有像我天真希望的那样推断类型。
这里有一个小例子,它简单地接受一个字符串向量并计算它们的长度:
#include <vector>
#include <iostream>
#include <ranges>
template<typename E>
auto length(const E& s)
{
std::cout << "Templated length()\n";
return static_cast<int>(s.length());
}
template<typename E>
auto getLengths(const std::vector<E>& v)
{
return v | std::views::transform(length<E>);
}
int main()
{
std::vector<std::string> vec = { "Larry","Curly","Moe" };
for (int i : getLengths(vec))
{
std::cout << i << "\n";
}
return 0;
}
输出:
Templated length()
5
Templated length()
5
Templated length()
3
我的问题是为什么要更改此行中的代码(删除<E>):
return v | std::views::transform(length);
给我一大堆错误,开头是:Error C2672 'operator __surrogate_func': no matching overloaded function found?
为什么编译器不推断类型是std::string?如果我用非模板函数替换模板:
auto length(const std::string& s) -> int
{
std::cout << "Specialized length()\n";
return static_cast<int>(s.length());
}
代码编译并运行,很明显,没有模板,编译器会找到我正在使用的特定类型的匹配项。
【问题讨论】: