Ниже показано, как я обычно решаю эту проблему в системах, требующих информацию метакласса.Смотрите также другой ответ для более прямого решения вашей проблемы.
Шаблон, используемый в stl, должен использовать тип для представления типа, а не строки.Таким образом, std::vector<T>::value_type
представляет тип, хранящийся в векторе.Затем это зависит от клиентского кода, чтобы использовать этот тип.
Если вам нужен тип времени выполнения объекта, используйте базовый класс, у которого есть виртуальная функция, которая возвращает тип.Для статического типа места вы можете использовать частичную специализацию:
Object.h
#ifndef OBJECT_H
#define OBJECT_H
#include <string>
template <typename T>
struct type_info {
// extend type_info<void*> to inherit defaults
const static bool is_array = false;
};
template <typename T>
std::string type_name ( const T& )
{
return type_info<T>::name();
};
template <typename T>
std::string type_name ()
{
return type_info<T>::name();
};
#endif
Parent.h
#include "Object.h"
#include "Array.h"
class Child;
class Parent
{
public:
Array<Child> getChildren() {
return Array<Child>();
}
};
template <>
struct type_info <Parent> : public type_info<void*> {
static std::string name () {
return "parent";
}
};
#endif
Array.h
template <typename ElementType>
class Array
{
public:
typedef ElementType value_type;
};
template <typename T>
struct type_info <Array<T > > {
static std::string name () {
return "Array<" + type_name<T>() + ">";
}
const static bool is_array = true;
};
Child.h
#ifndef CHILD_H
#define CHILD_H
#include "Parent.h"
class Child: public Parent
{
};
template <>
struct type_info <Child> : public type_info<void*> {
static std::string name () {
return "child";
}
};
#endif
Main.cpp
#include "Object.h"
#include "Parent.h"
#include "Child.h"
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
using std::boolalpha;
template<typename T> bool type_is_array (const T&) { return type_info<T>::is_array; }
int main(int argc, char* argv[])
{
Parent parent;
cout << type_name<Parent>() << endl;
cout << type_name(parent.getChildren()) << endl;
cout << boolalpha << type_is_array(parent) << endl;
cout << boolalpha << type_is_array(parent.getChildren()) << endl;
return 0;
}