我正在使用C ++编写API,并尝试/真的/很难不使用RTTI(运行时类型信息)来实现一些依赖注入功能。
我相信我可以做到这一点,但通过使用模板 - 但它让我感到疑惑:
当模板被“扩展”并由编译器实现时,它们实际上引入了循环依赖(编译时或运行时),模板类是在框架库中实现的,以及它的客户端class是在上层的库中吗?
感谢您的帮助!
#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 :(得分:3)
模板的代码在实例化的编译单元中生成。在您的示例中,生成的计算机代码将位于Application.lib
。
答案 1 :(得分:0)
您的意思是循环模板依赖关系,如:
template<class T>
using A = B<T>;
template<class T>
using B = A<T>;
int main()
{
A<int>;
}
这在A的声明中失败,因为B不可用,如果你声明它抱怨它不完整。
我认为模板中可能没有循环依赖关系,因为必须为每个用于实例化的模板参数提供完整的类型。鉴于此,模板实例化链必须是非循环的。