Какой идиоматический способ пройти повышение :: mpl :: list?

Edit: Я отредактировал образец, чтобы лучше напоминать мою проблему, теперь функция зависит от обычного параметра (а не только от параметров шаблона), что означает, что вычисленияcan't быть сделано во время компиляции.

Я написал код с написанным от рукиTypeList и теперь мы начали использоватьувеличение и я пытаюсь переместить его вmpl библиотека.

Кажется, я не могу найти приличную документацию дляmpl::list и мне даже не удается перенести код наboost::mpl, У меня есть ощущение, что даже когда (если?) Мне удастся перенести код, он все равно не будет идиоматическим. Можно & APOS; пожалуйста, дайте мне знать, как должно быть написано следующееboost (обратите внимание, что это не фактический код, а искусственное упрощение).

Original code (вставьте codepad.org)

class nil {};

template <class Head, class Tail = nil>
struct type_list {
    typedef Head head;
    typedef Tail tail;
};

template <class List>
struct foo;

template <class Head, class Tail>
struct foo<type_list<Head, Tail> >{
    template <class T>
    static void* bar(T* obj, size_t size)
    {
        if (sizeof(Head) == size) 
            return reinterpret_cast<Head*>(obj);

        // Otherwise check the rest of the list
        return foo<Tail>::bar(obj, size);
    }
};


template <>
struct foo<nil>
{
    template <class T>
    static void* bar(T*, size_t)  { return NULL; }
};

#include <iostream>

int main()
{
    int n = 3;
    void *p = foo<type_list<char, type_list<bool, 
                      type_list<double, type_list<long> > > >
                 >::bar(&n, 4); 
    std::cout<< p << std::endl;
}

Failed Attempt to use Boost (вставьте codepad.org)

#include <boost/mpl/list.hpp>

template <class List>
struct foo{
    template <class T>
    static void* bar(T* obj, size_t size)
    {
        typedef typename boost::mpl::front<List>::type type;
        if (sizeof(type) == size) 
            return reinterpret_cast<type*>(obj);

        // Otherwise check the rest of the list
    return foo<typename List::next>::bar(obj, size);
  }
};

template <>
struct foo<boost::mpl::list0<boost::mpl::na> >
{
    template <class T>
    static void* bar(T*)
    {
        return NULL;
    }
};

#include <iostream>

int main()
{
    int n = 3;
    void *p = foo<boost::mpl::list<char, bool, double, long> >::bar(&n, 4);
    std::cout << p << std::endl;
}

Ответы на вопрос(4)

Ваш ответ на вопрос