Boost logo

Boost :

From: Christian Holmquist (c.holmquist_at_[hidden])
Date: 2007-05-10 06:56:15


I've had much use of a small traits class for identifying types that matches
the STL Container concept (roughly) .
Two functions is made available, is_container<T> and

is_container simply evaluates to true_type or false_type,
container_category_of tries to categorize T with the following tags.

    struct non_container_tag {};
    struct container_tag {};
    struct sequence_container_tag : public container_tag {};
    struct associative_container_tag : public container_tag {};
    struct hashed_container_tag : public associative_container_tag {};

    template<class T, class Tag = container_tag>
    struct is_container

It seems to work for STL containers, boost multi index, boost array etc..
haven't tried with ptr_containers yet but they should work, since the
implementation just looks for a couple of member types using

Writing stream operators for a container can be implemented like

template<class CharType, class CharTrait, class Container>
inline typename boost::enable_if<is_container<Container>,
basic_ostream<CharType, CharTrait>&>::type
operator <<(basic_ostream<CharType, CharTrait>& os, const Container& c)
    if (!os.good() ) return os;
    detail::write_container(os, c, d);
    return os;

Writing a generic insert() could look something like

    namespace detail
        template<class Container, class T>
        bool insert(Container& c, const T& t, sequence_container_tag)
            c.push_back(t); return true;
        template<class Container, class T>
        bool insert(Container& c, const T& t, associative_container_tag)
            return c.insert(t).second;

    template<class Container, class T>
    bool insert(Container& c, const T& t)
        return detail::insert(c, t,

Could this be of any use in boost?

/ Christian

Boost list run by bdawes at, gregod at, cpdaniel at, john at