我希望能够调试一些模板代码,以更好地理解它。
不幸的是,我对模板元编程比较陌生,很难入手。
当我尝试输出预处理后的源文件时,会得到 125,000 行代码 :/
那么有没有办法可以看到生成的代码呢?(我使用的库是SeqAn)
我希望能够调试一些模板代码,以更好地理解它。
不幸的是,我对模板元编程比较陌生,很难入手。
当我尝试输出预处理后的源文件时,会得到 125,000 行代码 :/
那么有没有办法可以看到生成的代码呢?(我使用的库是SeqAn)
一般来说,不能这样做。模板只是C++语言的一部分,它们不是单独的预处理器,因此它们不会生成C++代码。
通常的解决方案是在代码中加入静态断言和其他测试来验证正确的模板以正确的方式被实例化。
一旦你开始迷失在元编程中,这个简单的技巧可以帮助你确定模板参数的真正类型:
// given a variable t of an unknown type T
int*** i = t;
template<class Head, class Tail>
struct type_list
{
typedef Head head;
typedef Tail tail;
};
struct null_type
{};
template<class List>
struct list_head
{
typedef typename List::head head;
};
template<class List>
struct list_tail
{
typedef typename List::tail tail;
};
template<class List>
struct list_length
{
static const size_t length = 1+list_length< typename list_tail<List>::tail >::length;
};
template<>
struct list_length<null_type>
{
static const size_t length = 0;
};
int main()
{
typedef
type_list
< int
, type_list
< double
, type_list
< char
, null_type
>
>
> my_types;
my_types test1;
size_t length=list_length<my_types>::length;
list_head<list_tail<list_tail<my_types>::tail>::tail>::head test2;
}
我刚刚实例化了我的元类型。这些仍然是空的C++类实例,长度至少为1字节。现在,我可以在最后一个test2实例化之后设置断点,看看test1和test2的类型/值长度:
调试器显示如下:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
现在你知道头部返回了一个字符,你的列表包含int、double、char类型,并以null_type结尾。
这对我帮助很大。有时候你需要把混乱的类型复制到文本编辑器并将其格式化成可读的形式,但这给了你追踪内部计算内容的可能性。
希望这能帮到你,
Ovanes