#include <iostream>

class List
{
public:
    constexpr List():
        m_data(nullptr),
        m_next(this),
        m_previous(this)
    {
    }

    List(const void *data):
        m_data(data)
    {
        m_next = &root;
        m_previous = root.m_previous;
        root.m_previous = root.m_previous->m_next = this;
    }

    template <typename Func>
    static void ForEach(Func f)
    {
        List *ptr = root.m_next;
        while (ptr != &root)
        {
            f(ptr->m_data);
            ptr = ptr->m_next;
        }
    }
private:
    static List root;
private:
    const void *m_data;
    List *m_next;
    List *m_previous;
};


List a("foo");
List b("bar");
List List::root;

int main()
{
    List::ForEach([](const void* ptr)
    {
        std::cout << static_cast<const char*>(ptr) << std::endl;
    });
}