Простой способ использования алгоритмов STL в C ++ - PullRequest
1 голос
/ 07 октября 2011

У меня есть этот код на Win32:

Actor* Scene::GetActor(const char* name)
{
    StringID actorID(name);

    auto actor = find_if(m_actors.begin(), m_actors.end(), [&](Actor* actor){return actor->GetName() == actorID;});
    return  actor != m_actors.end() ? *actor : NULL;
}

Поскольку это не может быть скомпилировано на iPhone с GCC / LLVM Clang, я хочу удалить из него функции C ++ 11. Есть ли другой простой способ использования алгоритмов STL без использования функций C ++ 11? Я не хочу объявлять простую функцию, подобную этой функции сравнения, везде в коде.

Ответы [ 3 ]

7 голосов
/ 07 октября 2011

Вы можете попытаться реализовать общий предикат для этого, что-то вроде этого (демо здесь ):

template<class C, class T, T (C::*func)() const>
class AttributeEquals {
public:
    AttributeEquals(const T& value) : value(value) {}

    bool operator()(const C& instance) {
        return (instance.*func)() == value;
    }
private:
    const T& value;
};

Это потребует дополнительных настроек, так как в вашем случае вы работаете с указателями, но вы получите общее представление.

4 голосов
/ 07 октября 2011

Вы пробовали использовать блоки?

auto actor = find_if(m_actors.begin(), m_actors.end(),
                     ^(Actor* actor){return actor->GetName() == actorID;});
2 голосов
/ 07 октября 2011

Вместо того, чтобы использовать анонимную функцию, вам придется определить и построить функтор. Вам также придется отбросить ключевое слово auto.

Actor* Scene::GetActor(const char* name)
{
    StringID actorID(name);
    MyFunctor funct(actorID); // move code from anon function to operator() of MyFunctor
    // Replace InputIterator with something appropriate - might use a shortening typedef
    InputIterator actor = find_if(m_actors.begin(), m_actors.end(), funct);
    return  actor != m_actors.end() ? *actor : NULL;
}

Если StringID - ваш собственный класс, вы можете сделать его функтором, определив operator ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...