这只需要用g ++工作。
我想要一个功能
template<typename T> std::string magic();
这样:
Class Foo{}; magic<Foo>(); // returns "Foo";
Class Bar{}; magic<Bar>(); // returns "Bar";
我不希望这是通过专业化来完成的(即必须为每种类型定义魔法。我希望在这里拉出一些宏/模板黑魔法。任何人都知道怎么做?)
谢谢!
答案 0 :(得分: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)
此处magic(int)
提供字符串"int"
,而magic(Foo)
提供“'Foo'未声明”错误,如果没有此类。
答案 1 :(得分:8)
首先尝试typeid(Foo).name()
。你认为合适的解析;将依赖于实现(但简单地将字符串返回是可移植的)。
答案 2 :(得分:4)
宏上的字符串化运算符可能就是您要查找的内容:
#define MAGICCLASSNAME(str) std::string magic(#str)
class Foo{}; MAGICCLASSNAME(foo)
答案 3 :(得分:1)
我想出了以下内容:
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
class Foo{};
class Bar{};
template<typename T>
inline std::string magic(const T& obj)
{
return typeid(obj).name();
}
int main()
{
Foo a;
cout << magic<Foo>(a); // returns "Foo";
}
我用g ++测试了这个并运行良好。
我也从this得到了答案。
答案 4 :(得分:-1)
在 C ++ 中,你可能正在寻找模板黑魔法。如果是这样,Modern C++ Design会有所帮助。