0

那是我的模板功能:

template<class DataStruct>
    static bool isPlayerIn(DataStruct players, int id){
        for(DataStruct::iterator player = players.begin();
                player != players.end(); ++player){
            if((*player)->_id == id){
                return true;
            }
        }
        return false;
    }

我希望它能够将玩家作为矢量和地图,或任何其他 STL。我不能使用算法查找,因为我正在搜索一个“玩家”,他的内部字段 id 与给定参数相同。有什么办法可以完成这项工作吗?

它抱怨:

(*player)->_id

因为它不知道 player 是指向 Player 类的指针。

4

3 回答 3

1

既然你要求它,你可以把 lambda 放在一个isSameID函数中,如果它将在多个地方使用。当您进行代码维护时,它也可能会使它更容易阅读。

template <class ContType>
bool isSameID(ContType cont, int id) {
    auto found = find_if(begin(cont), end(cont), [id] (auto item) {
        return item->_id == id;
    });
   return found != end(cont);
}

此函数假定容器已传递并且您使用的是 c++14。

更新 1: 使其适用于两者的最快方法是mapvector检索_id从函数中分离出来,让编译器选择正确的方法来获取_id给定容器类型的。我还auto根据您的要求删除了并切换到传递容器const&以避免复制:

    int GetID(const pair<int, Player*>& item) {
        return item.second->_id;
    }
    int GetID(Player* item) {
        return item->_id;
    }

    template <class ContType>
        bool isSameID(const ContType& cont, int id) {
            typename ContType::const_iterator found = find_if(begin(cont), end(cont),
               [id] (typename ContType::value_type item) {
                return GetID(item) == id;
            });
           return found != end(cont);
        }
于 2016-01-18T14:36:49.537 回答
1

使用 C++11,您可以轻松地使用find_iflambda函数

[=](const typename DataStruct::value_type &v){return v._id == id;}

你会在哪里使用类似的东西

auto has_id = [=](const typename DataStruct::value_type &v){return v._id == id;};

return std::find_if(
    std::begin(players),
    std::end(players),
    has_id) != std::end(players);
于 2016-01-18T14:21:39.050 回答
0

你的封装有问题,因为函数不知道 DataStruct 是什么,它不能直接取消引用它的内部迭代器。如果您为迭代器实现了取消引用运算符,它将起作用。

在迭代器中添加:

objStored *operator(){
    return **this;
}

然后在你的播放器 obj 中添加一个获取 id 的方法:

int getId(){
return this->id;
}

而不是(*player)->_id == id(*player)->getId()

这样,在迭代器中拥有(以任何方式)支持(以任何方式)getId方法的对象的任何类都将起作用。

如果您使用模板创建通用函数,则不应创建它,因此它仅适用于具有迭代器的类,该迭代器是指向具有 _id 成员的播放器的指针。尽量少假设你的对象。

于 2016-01-18T14:15:23.653 回答