获取模板参数的字符串表示

3
我希望能够在模板类中创建一个方法,返回替换在模板参数中的类型名称。
例如:
template <typename T>
class CPropertyValueT 
{
  std::string GetTypeName()
  {
    return #T;
  }
}

通过使用 # 的预处理器宏,这是可能的,我想一定有一种使用模板的方法。

这是可能的吗?

1个回答

6
你可以使用typeid(T).name(),但它将返回类型的修饰名称。
如果你正在使用GCC,则可以使用在cxxabi.h头文件中声明的GCC API来解开名称。
以下是一个示例(来源):
#include <exception>
#include <iostream>
#include <cxxabi.h>

struct empty { };

template <typename T, int N>
  struct bar { };


int main()
{
  int     status;
  char   *realname;

  // exception classes not in <stdexcept>, thrown by the implementation
  // instead of the user
  std::bad_exception  e;
  realname = abi::__cxa_demangle(e.what(), 0, 0, &status);
  std::cout << e.what() << "\t=> " << realname << "\t: " << status << '\n';
  free(realname);


  // typeid
  bar<empty,17>          u;
  const std::type_info  &ti = typeid(u);

  realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
  std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
  free(realname);

  return 0;
}

输出:

  St13bad_exception       => std::bad_exception   : 0
  3barI5emptyLi17EE       => bar<empty, 17>       : 0

另一个有趣的链接,描述了在GCC和Microsoft VC++中的名字重整(demangling):


好的回答,这是最好的答案。然而,值得注意的是,按照标准,name()并不强制返回任何有意义的内容,因此这是一个质量问题。 - Armen Tsirunyan
@ArmenTsirunyan:是的。顺便说一下,我在我的回答中添加了更多内容。 - Nawaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接