Нет, но вы можете сделать одно:
template<class T> struct meta {
static const std::string& get_name() {return T::class_name;}
};
и затем либо добавить статический член class_name
в класс:
class MyClass {
public:
static const std::string class_name("MyClass");
};
, либо специализовать мета:
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)");
}