在 C++ 中获取元类类型

Mar*_*tin 6 c++ metaprogramming metaclass

背景

在他的提案CppCon 演讲中,Herb Sutter 建议将元类添加到 C++。这使用户在编译期间在创建和增强新类型方面具有更大的灵活性。提案中的示例之一是interface元类或the plain-struct元类的创建。

在当前执行的C ++的有三个关键词来声明类型:classstruct,和enum

想象一下,我们创建了一个新的元类plain_struct,使我们能够编写如下代码

plain_struct User {
    string name;
    string surname;
};
Run Code Online (Sandbox Code Playgroud)

稍后我们可以有一个函数或一个类方法来接受一个模板参数,比如

template <typename T>
void printUser(T user) {
     cout << user.name << " " << user.surname << endl;
}
/* 
   ...
*/
User u("N", "S");
printUser(u);
Run Code Online (Sandbox Code Playgroud)

问题

有没有办法重载这个函数,或者在运行时以某种方式检测传递给函数的对象printUser是否属于元类struct/class或自定义的plain_struct.

例如,是否有可能有这样的东西(下面的代码更像是一个伪代码,而不是实际工作的)?

template <class T>
void printUser(T user) {
     cout << "User is of metaclass class";
}
template <plain_struct T>
void printUser(T user) {
     cout << "User is of metaclass plain_struct";
}
/* 
   ...
*/
User u("N", "S");
printUser(u);  // prints "User is of metaclass plain_struct"
Run Code Online (Sandbox Code Playgroud)