2016-03-03 51 views
1

最近,我在使用Template Metaprogramming(使用現代C++設計作爲我當前的參考)構建個人庫方面取得了進展。用於C++模板的聲明和定義分離

我一直在想最好的方式來佈局我的模板代碼。顯然,編譯器希望模板的定義在聲明的同一個文件中可見。但是,我想將聲明從定義中分離出來,所以當我只想查看方法原型或其他東西時,我不太會去查看。

因此,要解決這個問題,我已經開始做可以通過下面的例子來說明:

SomeClass.hpp

#ifndef _someclass_hpp 
#define _someclass_hpp 

template<typename T> 
class SomeClass { 
public: 
... 
private: 
... 
}; 

#include "SomeClass_Implementation.hpp" 

#endif 

SomeClass_Implementation.hpp

#ifndef _someclass_impl_hpp 
#define _someclass_impl_hpp 

#include "SomeClass.hpp" 

/* SomeClass Implementation... */ 

#endif 

我個人喜歡這個比在一個文件中擁有所有東西,但我我很好奇,如果任何人有任何提示接近這個或任何推理,可能會讓我考慮只是把它全部存入一個文件。

回答

0

一種方法我想是這樣做:

Header.hpp:

#ifndef FileGuard_whatever // technically reserved by STL because 
#define FileGuard_whatever // it starts with a capital letter 

template <typename T> 
class A 
{ 
    void go (T const& value) ; 
} ; 

#include "Header.hxx" // implementation details 

#endif // FileGuard 

Header.hxx:

template <typename T> 
void A<T>::go (T const& value) { } 

,這是相當多的,你做什麼。我省略了另一個文件中的File Guard,並給出了一個讓人們知道不要導入它的名字。

我對此有好運。它需要人秒弄明白,但.hxx幫助至少有一個位(「這是不同的; OK,如何有什麼不同?」)

+0

我喜歡做的實現頭文件與懷念稍有不同的延伸。它很微妙,但正如你所說,它有助於表明它與定義標題不同。直到你的例子我還沒有意識到有一個.hxx擴展名!我會等待看到其他任何迴應,看看是否還有其他有趣的方法。 – spektr