我有两种类型: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)
问题是如何实现
答案 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
}
}
答案 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
}