我有一个自定义矢量类,它的所有意图和目的就像 std::vector 一样。我想添加一个简单的地图功能:
template <class T> class Vector
{
public:
template<class mapFunction> Vector<typename mapFunction::result_type> map(mapFunction function)
{
Vector<mapFunction::result_type> result(_Length);
for(UINT i = 0; i < _Length; i++)
{
result[i] = function(_Data[i]);
}
return result;
}
...
}
用法:
Vector<int> v(5);
for(int i = 0; i < 5; i++) v[i] = i;
auto mappedVector = v.map(function<double(int)>([](int a) { return a * 2.0; }));
这可行,但我试图避免将 lambda 表达式转换为std::function
. 理想情况下,v.map([](int a) { return a * 2.0; }));
我意识到我可能会编写一个类似于“make_pair”的“make_function”来避免需要模板参数,但你仍然需要转换所有的 lambdas。
我将它转换为 astd::function
因为我不知道如何从原始 lambda 类型中提取返回类型;因此我使用std::function::result_type
.
我认为以下方法会起作用,但它不起作用——编译器只是抱怨它无法推断出“returnType”的模板参数:
template<class mapFunction, class returnType> Vector<returnType> Map2(mapFunction function)
{
Vector<returnType> result(_Length);
for(UINT i = 0; i < _Length; i++)
{
result[i] = function(_Data[i]);
}
return result;
}
我意识到这样std::transform
做(我可以很容易地用调用替换 map 的主体std::transform
),但我的问题实际上在于指定模板参数的正确方法。