具有基类的 C++ 唯一静态 ID 和类名

标签 c++ rtti

拥有类TaskBase,它的每个派生类都必须有名称和唯一的id。

TaskBase 如下所示:

class TaskBase
{
public:
    static const int id()
    {
        // return an unique id, for each object or derived class, HOW ??
    }

    static const string name()
    {
        // return class name for each derived class, HOW ??
        // for example : "TaskBase" for this class
    }
};

我的尝试是:

template <typename DERIVED>
class TaskBase
{
public:

    static const int id() 
    {
        static const int id = reinterpret_cast<int> (typeid (DERIVED).name());
        return id;
    }

    static const string name() 
    {
        static string n;

        if (!n.size())
        {
            int status;
            char *realname = abi::__cxa_demangle(typeid (DERIVED).name(), 0, 0, &status);
            n = realname;
            free(realname);
        }

        return n;
    }
};

我已经阅读了 this ,但我需要能够拥有指向每个派生类的基指针,如下所示:

class MyTask1 : public TaskBase
{
};

MyTask1 myTask1, myTask2;
TaskBase *base = &myTask1;

最佳答案

class TaskBase
{
private:
    const void*  m_id;
    string m_name;

public:
    TaskBase(const void* m_id, string m_name): m_id(m_id), m_name(m_name)
    {
    }

    const void* id() const
    {
        return m_id;
    }

    string name() const
    {
         return m_name;
    };
};

template< typename DERIVED >
class TaskProxy: public TaskBase
{
public:   
    static const void* id()
    {
        //if you want to have for each object a unique id:
        //return reinterpret_cast<void*>(this);
        //just for each TaskProxy<????>:
        return reinterpret_cast<const void*>(typeid( DERIVED ).name());
    }

    static string name()
    {
        return typeid( DERIVED ).name();
    }

    TaskProxy(): TaskBase(id(), name()) {}
};

用法:

class MyTask1 : public TaskProxy< MyTask1 >
{
};

class MyTask2 : public TaskProxy< MyTask2 >
{
};

...

MyTask1 myTask1;
TaskBase *baseA = &myTask1;
MyTask2 myTask2;
TaskBase *baseB = &myTask2;

cout << "Name: " << baseA->name() << "  Id:" << baseA->id() << endl;
cout << "Name: " << baseB->name() << "  Id:" << baseB->id() << endl;

输出这个(使用 gcc 4.6):

Name: 7MyTask1  Id:0x401228
Name: 7MyTask2  Id:0x4011c0

关于具有基类的 C++ 唯一静态 ID 和类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7691697/

相关文章:

c++ - 仅检索对象的类型

c++ - 为什么 'pure polymorphism' 比使用 RTTI 更可取?

delphi - 如何使用Delphi RTTI获取和设置记录值

c++ - 通过套接字接收 GET 请求

c++ - 无法在C++中包含头文件

c++ - 将大型体素数据传输到 GLSL 着色器

c++ - 为什么我会收到 std::bad_alloc 错误

c++ - 为什么要使用 RTTI?

delphi - Delphi 中的动态赋值

c++ - C++ 中的 "long"、 "long long"、 "long int"和 "long long int"有什么区别?