C++ C++;模板黑魔法

C++ C++;模板黑魔法,c++,templates,C++,Templates,这只需要在g++中工作 我想要一个函数 template<typename T> std::string magic(); template std::string magic(); 以便: Class Foo{}; magic<Foo>(); // returns "Foo"; Class Bar{}; magic<Bar>(); // returns "Bar"; Class Foo{};magic();//返回“Foo”; 类条{};magic()

这只需要在g++中工作

我想要一个函数

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

Class Foo{}; magic<Foo>(); // returns "Foo";
Class Bar{}; magic<Bar>(); // returns "Bar";
Class Foo{};magic();//返回“Foo”;
类条{};magic();//返回“Bar”;
我不希望通过专门化来实现这一点(即必须为每种类型定义魔法。我希望在这里引入一些宏/模板黑魔法。有人知道怎么做吗?)


谢谢

宏上的字符串化操作符可能就是您要寻找的:

#define MAGICCLASSNAME(str) std::string magic(#str)
class Foo{}; MAGICCLASSNAME(foo)

首先尝试
typeid(Foo).name()
。按您认为合适的方式解析;将依赖于实现(但简单地获取字符串是可移植的)。

我提出了以下建议:

#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";
}
#包括
#包括
#包括
使用名称空间std;
类Foo{};
类条{};
模板
内联标准::字符串魔术(常量T&obj)
{
返回typeid(obj.name();
}
int main()
{
福阿;
cout若要将类型(或其他标识符)转换为字符串,您需要一个宏,但宏无法检查其参数是否为有效类型。若要添加类型检查,可以向宏中添加模板函数:

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)
模板
std::string magic_impl(const char*name){return name;}
#定义更多的魔法(a)魔法(a)
#定义魔术(a)更多的魔术(a)

这里
magic(int)
给出字符串
“int”
,而
magic(Foo)
给出一个“'Foo'未声明”如果没有这样的类,则会出现错误。

现在,这其中的哪一部分是必需的,而您只是编写了哪一部分,因为您认为它是必需的。类Foo重要吗?给我们一个更现实的用例。这是对某种简单的静态反射机制的一个相当明显的要求,它不会带来RTTI的全部功能。我想玩得开心因为我可以传递任何类型,它将返回我的类型名称。在C++中,你可能正在寻找模板黑魔法。如果是这样的话,会有帮助。根据你认为合适的方式分析,例如:<代码> char *n=Type(FO).NAME();而(*N&&N'A')++n;
在这里给出的所有答案中,我最喜欢这个答案,因为a)它会进行类型检查b)结果是类名,而不是任何可能依赖于编译器的损坏形式。更多的魔法存在只是为了检查名为“a”的类型是否已声明并且在范围内。没有它,我可以调用magic(%%)即使%%%%不是某个类型的合法名称,也要获得成功调用。