Динамическое создание typedef - PullRequest
2 голосов
/ 19 июня 2010

Я создаю систему событий. Он основан на boost :: сигналы. Чтобы упростить работу, я использую typedef для сигнатур функций.

Все хорошо, пока мне не нужно создать системный метод какого-то нового события. Я должен создать typedef динамически по заданному типу для функции шаблона. Проблема заключается в названии typedef.

Какой-нибудь псевдокод у меня будет:

template<typename EventType>
void create(const string &signalName)
{
   typedef EventType signalName;
   // ...
}

Можно ли создать такой typedef (их имена) с какой-нибудь переданной строкой или данными или чем-то еще? Я не хочу заботиться об этом.


UPD : Итак, у меня есть список функций-подписей typedefs - события. У меня есть некоторые шаблонные функции для подключения слотов, например. Я не хочу заставлять пользователя каждый раз снова вводить подпись своими руками (пользователь - программист, который будет использовать систему событий). Поэтому я просто использую свои определения типов из специального пространства имен в аргументе шаблона.

Ответы [ 3 ]

4 голосов
/ 19 июня 2010

typedefs имеет значение только во время компиляции.Насколько я знаю, это просто псевдоним для типа.

3 голосов
/ 19 июня 2010

Параметры шаблона по определению являются сущностями времени компиляции. Насколько я знаю, вы не можете динамически создавать шаблоны классов во время выполнения программы.

1 голос
/ 19 июня 2010

В этом случае я бы не стал использовать typedef.Если вы хотите иметь несколько типов событий и создавать их динамически, вы можете использовать простой класс, содержащий информацию о типе события.Когда у вас есть событие, вы связываете его с типом события, созданным ранее.

Примерно так:

class EventType
{
  private:
    string type;

  EventType(string type);
};

class Event
{
  private:
    string event_name;
    EventType *event_type;

  Event(string event_name, EventType event_type);
};

...

void create(const string &signalName)
{
  EventType *event_type = new EventType("type_x");
  Event *event = new Event("event_x", event_type);
}
...