2

テンプレートメタプログラミングを使用するVisualStudio2008 C++03アプリケーションがあります。MPLのコンパイルにはかなりの時間がかかる場合があります(約15分)。コードの無関係な部分に小さな変更を加えるたびに、このコストが発生することは明らかにありません。そこで、それらを分割してオブジェクトファイルを分離したいと思います。

例えば:

// Foo.hpp
template< typename T >
inline boost::shared_ptr< Bar > Foo( const Data& d )
{
    /* MPL magic takes a long time to compile */
    switch( d.a )
    {
    case 0:
        return MPLMagic::Create< ZeroTraits, T >( d.b, d.c  );
    case 1:
        return MPLMagic::Create< OneTraits, T >( d.b, d.c );
    default:
        return MPLMagic::Create< DefaultTraits, T >( d.b, d.c );
    }
}

// Bob.hpp
#include "Foo.hpp"
template< typename X, typename Y >
inline void BobFunc()
{
    Data d = /* Bob's data */;
    boost::shard_ptr< Bar > created = Foo< BobTraits >( d );
    // do bob stuff
}

// Charlie.hpp
#include "Foo.hpp"
template< typename X, typename Y >
inline void CharlieFunc()
{
    Data d = /* Charlie's data */;
    boost::shard_ptr< Bar > created = Foo< CharlieTraits >( d );
    // do charlie stuff
}

チャーリーへの変更でボブの再コンパイルが発生せず、関連のないセクションへの変更で両方を再コンパイルする必要がないように、これらのヘッダーファイルを分離するにはどうすればよいですか?

4

1 に答える 1

0

(上記のコードから)テンプレートをインスタンス化できるのはタイプの小さなサブセットのみであるという前提で、テンプレートを明示的にインスタンス化する単一の変換ユニット内の定義にテンプレートを分割できます。

さらに、具体的な工場が->のマップに登録されるパターンFooを実装するように変更することを検討してください。これにより、(おそらく最も高価な部分の)コンパイルを特定の特性ごとに1つずつ複数のファイルに分割できます。これにより、すべてのテンプレートマジックを再コンパイルすることなくフレームワークを拡張でき、さらにコンパイラのメモリフットプリントが削減されます。これは、今すぐコンパイルするのに非常に時間がかかる理由の1つである可能性があります。AbstractFactoryintcreatorFoo

于 2012-06-26T16:00:47.620 に答える