0

我正在使用 C++ 开发 API,并尝试/真的/努力不使用 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;
}
4

2 回答 2

3

模板的代码在实例化它的编译单元中生成。在您的示例中,生成的机器代码将位于Application.lib.

于 2013-02-05T21:30:43.273 回答
0

您的意思是循环模板依赖项,例如:

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

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

int main()
{
    A<int>;
}

这在 A 的声明中失败,因为 B 不可用,如果你 fwd 声明它,它会抱怨它不完整。

我认为模板中不可能有循环依赖,因为对于要进行实例化的每个模板参数都必须有一个完整的类型。鉴于此,模板实例化链因此必须是非循环的。

于 2013-02-05T21:50:29.507 回答