【发布时间】:2013-09-19 13:39:50
【问题描述】:
我有一个自定义向量类,它的所有意图和目的都类似于 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。
我将其转换为std::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 可以做到这一点(我可以很容易地用对std::transform 的调用来替换地图的主体),但我的问题实际上在于指定模板参数的正确方法。
【问题讨论】:
-
insted of lambda 尝试在类中传递一个自定义函子,其中定义了“result_type”类型..??
-
decltype(function(declval<T>()))代替mapFunction::result_type,也许? -
标准库中已经有一个具有相同功能的免费函数:
std::transform(source.begin(), source.end(), std::back_inserter(target), my_function); -
_Length和_Data是 C++ 中的保留标识符。