我有一个使用模板元编程的 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
}
如何将这些头文件分开,以便对查理的更改不会导致鲍勃的重新编译,并且对某些不相关的部分的更改不需要重新编译它们?