我使用了很多模板,偶尔很难弄清究竟是什么类型的东西。我想写一个实用程序给我一个漂亮的,漂亮的字符串名称,每种类型 - typeid()只是不削减它。举例来说,如果我有一个vector<int>
,在我的箱子gcc.4.6.4产生与typeid的以下内容:可能模板类型或非类型?
St6vectorIiSaIiEE
而我最好要
std::vector<
int,
std::allocator<
int
>
>
我写的东西,将工作与任何类型或类型的模板,但只是提供了两个模板:
template <typename T> struct simple_type_name;
template <template <typename....> class T> struct template_type_name;
哪个专业上int
或std::vector
c当帮助我建立我想要的琴弦。我也有部分专业simple_type_name
在任何Base<Args...>
来遍历所有的参数,并做适当的一切。这对int
和vector<int>
以及任何复杂的模板都是完全正确的......只要所有的模板都是类型。
如果有帮助,我的“完整的模板”的版本是这样的:
template <template <typename...> class Base, typename... Args>
struct simple_type_name<Base<Args...>>
{
static std::string name(int indent = 0) {
std::string base = template_type_name<Base>::name(indent);
std::string args[] = { simple_type_name<Args>::name(indent + 4)... } ;
// basic string putting together stuff here that is less interesting
}
};
问题是:我怎么做我有什么,比如说,std::array<int, 10>
工作?我不知道如何处理非类型参数。这甚至有可能吗?
“我使用了很多模板,偶尔很难弄清究竟是什么类型的东西。”我爱C++ –
我记得应该有一个可用的函数(至少对于GCC),它可以为你的'typeid()。name'取消。 –
您是否尝试过使用'C++ filt'来取消名字? – greatwolf