C ++模板黑魔法

时间:2010-02-16 04:17:30

标签: c++ templates

这只需要用g ++工作。

我想要一个功能

template<typename T> std::string magic();

这样:

Class Foo{}; magic<Foo>(); // returns "Foo";
Class Bar{}; magic<Bar>(); // returns "Bar";

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

谢谢!

5 个答案:

答案 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会有所帮助。