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>;
}

B が利用できないため、これは A の宣言で失敗します。fwd を宣言すると、不完全であると不平を言います。

インスタンス化の作成に使用されるすべてのテンプレート パラメーターで完全な型を使用できる必要があるため、テンプレートに循環依存関係が存在する可能性はないと思います。したがって、テンプレートのインスタンス化のチェーンは非循環的でなければなりません。

于 2013-02-05T21:50:29.507 に答える