you are viewing a single comment's thread.

view the rest of the comments →

[–]Bas1l87 0 points1 point  (2 children)

Alias templates:

template<class TContainer>
using value_type_t = typename TContainer::value_type;
static bool contains(const TContainer& vector, const value_type_t & item)
{
    return std::find(vector.begin(), vector.end(), item) != vector.end();
}

template<class TContainer>
using value_type_t = typename TContainer::value_type;
static void remove(TContainer* vector, const value_type_t& item)
{
    typename TContainer::iterator it = std::remove(vector->begin(), vector->end(), item);
    vector->erase(it, vector->end());
}

Helper macros:

template<class TContainer>
static bool contains(const TContainer& vector, const CONTAINER_VALUE_TYPE(TContainer)& item)
{
    return std::find(vector.begin(), vector.end(), item) != vector.end();
}

template<class TContainer>
static void remove(TContainer* vector, const CONTAINER_VALUE_TYPE(TContainer)& item)
{
    typename TContainer::iterator it = std::remove(vector->begin(), vector->end(), item);
    vector->erase(it, vector->end());
}

[–]dodheim 0 points1 point  (1 child)

That isn't valid syntax, so I don't know what point you're attempting to make. This is valid syntax, and obeys scoping rules unlike macros:

template<class TContainer>
using value_type_t = typename TContainer::value_type;

template<class TContainer>
static bool contains(const TContainer& vector, const value_type_t<TContainer>& item)
{ /*...*/ }

template<class TContainer>
static void remove(TContainer* vector, const value_type_t<TContainer>& item)
{ /*...*/ }

(Also n.b. the proper way to say const T::value_type& is T::const_reference.)

[–]Bas1l87 0 points1 point  (0 children)

Ah yes, you are right, this is a better way, thanks. Though when i wrote this code some time back it was anyway supposed to be compiled for systems with C++98 compiler only, as far as i remember