在C ++ 11中向向量添加映射函数

马特·费舍尔

我有一个自定义的矢量类,对于所有意图和目的,其行为都与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”来避免模板参数的需要,但是您仍然需要强制转换所有的lambda。

我将其转换为a,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做到这一点(我可以轻松地通过调用来替换map的主体std::transform),但是我的问题确实在于正确地指定模板参数。

马克·加西亚

首先,不要std::function用于此类问题。


我先给你一个例子,然后给我一个简短的解释。请注意,我确实使用std::vector来存储数据并提供功能,因为我真的不想自己实现整个Vector类;)。

实时工作代码

#include <iostream>
#include <vector>

//                /---------------------------------------------------------\
//                |                                                    //   |
template<typename T>                                                   //   |
class Vector {                                                         //   |
public:                                                                //   |
    std::vector<T> data;                                               //   |
                                                                       //   |
    template<class mapFunction>                                        //   |
    // Below: use C++11 trailing return type                                |
    auto map(mapFunction function) -> Vector<decltype(function(std::declval<T>()))>
    //                                       |                                   |
    {   //                                   |                                   |
        //                                   \-----------------------------------/
        //                                          |
        //                                          |
        //                 /-----------------------------------\
        //                 |                                   |
        using ReturnType = decltype(function(std::declval<T>()));

        Vector<ReturnType> result;

        auto size = data.size(); 
        result.data.reserve(size);

        for(std::size_t i = 0; i < size; i++)
        {
           result.data.push_back(function(data[i]));
        }

        return result;
    }
};

int main() {
    Vector<int> v;
    for(int i = 0; i < 10; ++i) {
        v.data.push_back(i);
    }

    auto newV = v.map([](int i) -> float {
        return (i * 2.0f) + 0.5f;       // Multiply by 2 and add 0.5
    });

    for(auto e : newV.data) {
        std::cout << e << std::endl;
    }
}

首先,它使用C ++ 11的尾随返回类型功能。需要这样做,因为我们需要引用参数functiondecltype(function(std::declval<T>()))部分是一个有趣的部分。基本上,我们要求编译器

function给定类型的参数值的返回类型是T什么?”

然后,编译器给出返回类型,这就是我们赋予结果的第一个参数的结果Vector

后面的部分与您的部分具有相同的本质,尽管我为正确性和优雅性对其进行了修改。

请注意,在C ++ 14中,您可以删除尾随返回类型,然后执行

template<class mapFunction>
auto map(mapFunction function) {
   using ReturnType = decltype(function(std::declval<T>()));
   Vector<ReturnType> result;

   ...

   return result;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从LLVM向C ++ lambda添加映射

来自分类Dev

如何在映射 C++ 中向向量添加值

来自分类Dev

使用 C++ 中的 JavaScript 样式映射函数

来自分类Dev

映射函数的C ++类似物

来自分类Dev

在C ++中向std :: string添加函数

来自分类Dev

向量在结构中的c ++映射

来自分类Dev

向 Boomi 中没有的日期字符串添加偏移量 - Java/“Groovy”脚本映射函数

来自分类Dev

如何在C#中向Lambda函数添加属性?

来自分类Dev

C ++ 11中的流向量

来自分类Dev

c ++ 11中future的向量

来自分类Dev

Python 中的映射函数

来自分类Dev

C ++ 11向量构造函数副本与范围?

来自分类Dev

在C ++中对向量使用函数

来自分类Dev

一次向c ++向量添加多个元素

来自分类Dev

向量调整大小似乎需要C ++> = 11中的默认构造函数

来自分类Dev

C ++ 11中unique_ptr的向量

来自分类Dev

在C ++ 11中对向量分别使用

来自分类Dev

C ++ 11中模板化地图的向量

来自分类Dev

在purrrs映射函数中添加ifelse语句并应用一些tidyverse函数

来自分类Dev

Scala映射函数中的“ NotSerializableException”

来自分类Dev

如何在dask中映射函数

来自分类Dev

Javascript - 映射函数中的哈希数组

来自分类Dev

Swift 中的条件映射函数

来自分类Dev

在向量中调用重写函数(C ++)

来自分类Dev

析构函数在C ++中调用向量

来自分类Dev

在C函数中声明向量时出错

来自分类Dev

C ++ / C ++ 11中的函数组合

来自分类Dev

如何用标量添加两个向量并将结果保存在两个向量之一中并从C中的函数返回该向量?

来自分类Dev

从Java向类型添加映射-如何做到这一点?