C++ c++;11?

C++ c++;11?,c++,reflection,c++11,C++,Reflection,C++11,在c++11中,有没有一种标准方法可以通过一些模板黑魔法或通过一些标准库函数动态获取类的名称?一旦我发现函数原型的漂亮打印非常有用: 在GCC中,PRETTY_函数包含函数的类型签名及其裸名称 例如,对于模板化类或函数,可以将类名扩展为C字符串: template<typename T> class Vector { void foo(int i) { cout << __PRETTY_FUNCTION__ << endl; } }; 模板

在c++11中,有没有一种标准方法可以通过一些模板黑魔法或通过一些标准库函数动态获取类的名称?

一旦我发现函数原型的漂亮打印非常有用:

在GCC中,PRETTY_函数包含函数的类型签名及其裸名称

例如,对于模板化类或函数,可以将类名扩展为C字符串:

template<typename T>
class Vector {
  void foo(int i) {
    cout << __PRETTY_FUNCTION__ << endl;
  }
};
模板
类向量{
空富(内部一){

不能,但你可以做一个:

template<class T> struct meta {
    static const std::string& get_name() {return T::class_name;}
};
或专门化元:

template<> struct meta<int> { 
    static const std::string class_name("int");
    static const std::string& get_name() {return class_name;}
};
模板结构元{
静态常量std::字符串类名称(“int”);
static const std::string&get_name(){return class_name;}
};
(这里有一个宏,可以简化此操作)

#define specialize_meta(name)templatestruct meta{static const std::string class_name(#name);static const std::string&get_name(){return class_name;};
专攻元(双);
然后使用元模板:

int main() {
   std::cout << meta<int>::get_name();
}
intmain(){

std::cout
\uuuu PRETTY\u FUNCTION\uuuu
是GCC的一个扩展。@spraff,名称表示法不是标准的。请注意,如果您还想使用CV限定符,可以使用@HowardHinnant。它仍然基于
typeid(T)。name()
但是。如果所有内容都返回
std::string const&
而不是
std::string
,那么副本就会少得多。:-]而且,
meta::get\u name()
应该是静态的。@ildjarn:我让他们返回副本,这样
class\u name
的实现者就可以在一个完整的函数中组装更复杂的字符串,而不是要求它是静态的
std::string
成员。但是,我不能想出一个用例,所以我同意了你的建议。这需要在目标上做一些工作类。我不能这样做。@LorenzoPistone:不,不能这样做。修改目标类是最容易的,但请注意,我也让它用于
int
,我显然没有修改它。只需专门化元类。@LorenzoPistone:添加了一个宏,使添加专门化变得非常容易。
template<> struct meta<int> { 
    static const std::string class_name("int");
    static const std::string& get_name() {return class_name;}
};
#define specialize_meta(name) template<>struct meta<name>{static const std::string class_name(#name); static const std::string& get_name() {return class_name;} };
specialize_meta(double);
int main() {
   std::cout << meta<int>::get_name();
}
void foo(int) {} //function in question
template<class T, T& a> struct metafunc; //dont define generic.
template<decltype(foo), &foo> struct metafunc { //specialization
    static const std::string func_name("void foo(int)");
}