Какой идиоматический способ пройти повышение :: 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;
}