C++模板黑魔法

ano*_*non 5 c++ templates

这只需要用g ++工作.

我想要一个功能

template<typename T> std::string magic();
Run Code Online (Sandbox Code Playgroud)

这样:

Class Foo{}; magic<Foo>(); // returns "Foo";
Class Bar{}; magic<Bar>(); // returns "Bar";
Run Code Online (Sandbox Code Playgroud)

我不希望这是通过专业化来完成的(即必须为每种类型定义魔法.我希望在这里拉出一些宏/模板黑魔法.任何人都知道怎么做?)

谢谢!

sth*_*sth 10

要将类型(或其他标识符)转换为字符串,您需要一个宏,但宏不能检查它的参数是否是有效类型.要添加类型检查,可以将模板函数添加到宏中:

template<typename T>
std::string magic_impl(const char *name) { return name; }

#define more_magic(a) magic_impl<a>(#a)
#define magic(a) more_magic(a)
Run Code Online (Sandbox Code Playgroud)

这里magic(int)给出了字符串,"int"而如果没有这样的类则magic(Foo)给出"'Foo'未被声明"错误.

  • more_magic 的存在只是为了检查名为“a”的类型是否已声明且在范围内。如果没有它,我可以调用 magic(%%%%) 并使调用成功,即使 %%%% 不可能是类型的合法名称。 (2认同)

Pot*_*ter 8

尝试一下typeid(Foo).name().你认为合适的解析; 将依赖于实现(但简单地返回一个字符串是可移植的).