编辑:我已经编辑了示例以更好地解决我遇到的问题,现在该函数依赖于常规参数(而不仅取决于模板参数),这意味着计算不能在编译时进行。
我用手写的typelist编写了一些代码,现在我们开始使用boost,我正尝试将其移至mpl
库。
我似乎找不到mpl::list
的任何体面的文档,甚至无法将代码移植到boost::mpl
。我有一种感觉,即使我成功移植了代码(如果?),它仍然不会是惯用的。您能否让我知道如何用boost
编写以下内容(请注意,这不是实际的代码,这是人为的简化)。
原始代码 (codepad.org paste)
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;
}
尝试使用Boost (codepad.org paste)失败
#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;
}
最佳答案
像这样使用 boost::mpl::fold
:
#include <boost/mpl/list.hpp>
#include <boost/mpl/fold.hpp>
#include <iostream>
using namespace boost::mpl;
// Initial state:
struct foo_start {
template <typename T>
static void * bar( T *, size_t ) { return 0; }
};
// Folding Step: add This to Prev
template <typename Prev, typename This>
struct foo_iteration {
struct type {
template <typename T>
static void * bar( T * obj, size_t size ) {
if ( sizeof(This) == size )
return reinterpret_cast<This*>(obj);
else
return Prev::bar( obj, size );
}
};
};
// foo is just calling mpl::fold now:
template <typename List>
struct foo : fold< List, foo_start, foo_iteration<_,_> >::type {};
int main() {
int n = 3;
void * p = foo< list<char, bool, double, long> >::bar( &n, 4 );
std::cout << p << std::endl;
}
在这里打印
0
,但是然后我在amd64上,因此我需要将4
更改为8
,并获取非零值。高温超导
关于c++ - 遍历boost::mpl::list的惯用方式是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1185464/