Как вы передаете тип в качестве параметра в C++?

Я хочу передать тип в качестве параметра (не переменная или ссылка).

У меня есть этот рабочий код:

код выполнения, где "testState2" - это имя класса (т.е. тип в данном случае). Обратите внимание, что у него есть базовый тип state_t:

changeState(new testState2());

функция изменения состояния:

void state_t::changeState(state_t * new_state)
{
    // Check if the state has changed
    if (this != new_state)
    {
        qDebug() << this->name << ": State changed to: " << new_state->name;
        delete this;
        _state = new_state;
    }
    else
    {
        qDebug() << this->name << ": State un-changed";
    }
}

В этом коде я в основном создаю новый экземпляр testState2, но я хочу еще больше упростить вызывающий код. Я хочу просто передать тип, как это:

    changeState(testState2);

Примечание: "new" не существует, и это не создание экземпляра, просто передача имени класса, поэтому:

  1. Это вообще возможно?
  2. Если так, то как?

2 ответа

Решение

Классы (и типы в целом) в C++ не являются первоклассными значениями и поэтому не могут быть переданы или сохранены.

Для занятий вы можете теоретически использовать typeid но чаще всего мне показалось более полезным просто иметь строки, возвращаемые виртуальной функцией в экземплярах, и реестр для реализации шаблона "виртуального конструктора".

struct Base
{
    virtual const char *class_name() = 0;
    ...
};

struct MyClass : public(Base)
{
    virtual const char *class_name() { return "MyClass"; }
    ...
}

std::map<std::string, Base *(*)()> instance_builders;

Для изучения шаблона State, хорошим примером может послужить пример State Design Pattern в C++.

Другие вопросы по тегам