Внедряют ли реализации шаблона компилятора циклические зависимости?

Я работаю над API в C ++ и пытаюсь / действительно / усердно не использовать RTTI (информацию о типах времени выполнения) для реализации некоторых функций внедрения зависимостей.

Я верю, что могу сделать это, но с помощью шаблонов — но это заставило меня задуматься:

Когда шаблоны «расширены» и реализованы компилятором, действительно ли они вводят циклическую зависимость (либо время компиляции, либо время выполнения), когда класс шаблона реализован в библиотеке фреймворка, а клиент этого класса находится в верхняя многоуровневая библиотека?

Спасибо за вашу помощь!

#include <string>

/************************************************************/
// Implemented in Framework.lib
namespace Framework
{
template<typename ShapeTemplateType>
class Utility
{
void Do()
{
ShapeTemplateType x;
(void) x;
}
};
} // End namespace Framework

/************************************************************/
// Implemented in Application.lib
namespace Application
{
class StateObject
{
int i;
};

class Facade
{
Framework::Utility<StateObject> state;
};
} // End Namespace Application/********************************************************************/
// Implemented in Client
int main(int args, char* argv[])
{
Application::Facade facade;

//Derived d;
return 0;
}

0

Решение

Код для шаблона генерируется в модуле компиляции, где он создается. В вашем примере полученный машинный код будет в Application.lib,

3

Другие решения

Вы имеете в виду круговую зависимость шаблона:

template<class T>
using A = B<T>;

template<class T>
using B = A<T>;

int main()
{
A<int>;
}

Это не удается при объявлении A, потому что B недоступен, если вы объявите его, он будет жаловаться на его неполное.

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector