以类似方式处理std :: map <k,v>和std :: map <k,v *>

时间:2018-12-11 16:06:41

标签: c++

我有两种类型:import React, { Component } from 'react' import axios from 'axios' class SportList extends Component { state = { posts: [] } componentDidMount(){ axios.get('https://data.json') .then(res => { this.setState({ posts: res.data }); }) } render() { const { posts } = this.state; const uniquePosts = Object.values(posts.reduce((r,c) => { r[c.sport] = c return r }, {})) const postList = uniquePosts.length ? ( uniquePosts.map(post => { return ( <div key={post.id}> <div> {post.sport} </div> </div> ) }) ) : (<div>No Sports Available</div>) return (<div>{postList}</div>); } } export default SportList std::map<K,V>,还有很多功能,可以和std::map<K,V*>一起使用。 现在,我还需要通过这些函数处理std::map<K,V>对象。用同一代码实现对两种类型的处理的最佳方法是什么?

我有功能

std::map<K,V*>

,a也希望能够使用:

    std::map<K,V>& Process( std::map<K,V>& gData)
{
      for(auto && it: gData )
        //some code
}

我怀疑我必须编写两个包装,这将调用“ realProcessing”代码

std::map<K,V*>& Process( std::map<K,V*>& gData)

问题是如何实现

2 个答案:

答案 0 :(得分:3)

您可以添加抽象层。假设您有:

std::map<int, int> value_map{{1,1},{2,2},{3,3}};
std::map<int, int*> pointer_map{{1,new int(1)},{2,new int(2)},{3,new int(3)}};

您想使用相同的函数来迭代它们:

template<typename K, typename V>
void process(std::map<K, V>& data)
{
    for (auto& e : data)
    {
        // use e.second as an int if passed both maps
    }
}

您可以做的就是添加几个函数,这些函数将返回对该元素或其指向的引用:

template<typename T>
T& get_value(T& element)
{
    return element;
}

template<typename T>
T& get_value(T* element)
{
    return *element;
}

然后您可以像这样实现process

template<typename K, typename V>
void process(std::map<K, V>& data)
{
    for (auto& e : data)
    {
        auto& element = get_value(e.second);
        // use element here
    }
}

Live Example

答案 1 :(得分:0)

C++17 起,您也可以在以下情况下使用if constexpr,例如:

template <typename T>
auto get_value(T t) {
    if constexpr (std::is_pointer_v<T>)
        return *t; // deduces return type to int for T = int*
    else
        return t;  // deduces return type to int for T = int
}