C++: компиляция неиспользуемых классовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C++: компиляция неиспользуемых классов

Сообщение Anonymous »

Мне нравится использовать следующий шаблон для реализации фабричных классов (взято из моего ответа на этот вопрос):

Код: Выделить всё

class Factory
{
public:
template
DerivedType::CreatedType *createType()
{
DerivedType::CreatedType *r = (DerivedType::CreatedType) (*(m_creators[DerivedType::id]))();
return r;
}
protected:
static std::map m_creators;
};

std::map Factory::m_creators = std::map();

template
class CRTPFactory : public Factory
{
typedef typename CreatedType CreatedType;
public:
static bool register()
{
Factory::m_creators.push_back(std::make_pair(Derived::id,Derived::create);
return true;
}

private:
static bool m_temp;
};

template
bool CRTPFactory::m_temp = CRTPFactory::register();

class AFactory : public CRTPFactory
{
private:
static A *create()
{
//do all initialization stuff here
return new A;
}

public:
static const int id = 0;
};
Это позволяет расширять фабрику для новых типов без необходимости изменения класса фабрики. Это также позволяет реализовать определенные алгоритмы создания для разных типов без необходимости изменения фабричного класса. Однако у этого шаблона есть серьезная проблема. Класс AFactory никогда не используется явно. Он регистрирует свою функцию-создатель во время загрузки через временной элемент CRTPFactory. Это может быть немного сложно для понимания, но его очень легко использовать. Проблема в том, что AFactory не скомпилирован, поэтому его статические параметры не инициализируются во время загрузки. Мой вопрос: можно ли заставить компилятор (я использую VS 2012, но ответы для GCC тоже хороши) скомпилировать AFactory без явного создания его экземпляра?
Решение, которое я использую в VS, - это в dllexport AFactory, таким образом компилятор компилирует класс, даже если ему неизвестно, кто создал его экземпляр. Это потому, что предполагается, что какая-то другая dll может создать его экземпляр. Проблема с этим решением заключается в том, что фабричный класс должен быть реализован в отдельной dll, как и остальная часть кода. А также это не работает в GCC.

Подробнее здесь: https://stackoverflow.com/questions/174 ... ed-classes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»