2

我有一个使用模板元编程的 Visual Studio 2008 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以实现AbstractFactory具体工厂在int->的映射中注册的模式creator,这将允许您将Foo(可能是最昂贵的部分)的编译拆分为多个文件,每个文件对应一个特定的特征。这允许扩展框架而无需重新编译所有的模板魔法,另外将减少编译器的内存占用,这可能是现在编译需要这么多的原因之一。

于 2012-06-26T16:00:47.620 回答