2012-06-26 25 views
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 
} 

我怎样才能区分这些头文件出来,从而改变查理不承担Bob的编译和改变一些不相关的部分不需要重新编译他们两个?

+1

好吧,既然'BobFunc'和'CharlieFunc'不是模板,没有在头文件中定义它们应该会有很大帮助。 –

+1

您是否尝试过为'Foo.hpp'使用预编译头文件? – Naveen

+0

@MatthieuM。实际上也会帮助编译,看到他们不是'内联'和所有... –

回答

0

在上面的代码中假设您只允许一小部分类型实例化模板,您可以将模板分割成一个声明,在单个翻译单元中定义模板。

另外考虑改变Foo实现AbstractFactory图案,其中混凝土工厂在地图上int注册 - >creator,这将让你的Foo汇编(可能是最昂贵的部分)分割成多个文件,一个用于每个特定的特质。这允许扩展框架而不必重新编译所有的模板魔术,并且还会减少编译器的内存占用量,这可能是现在编译需要这么多的原因之一。