(這個問題有點晦澀沒有很大的動力,所以請多多包涵。)如何根據目標文件中缺少的符號來實例化模板?
爲了討論方便,我們假設我有兩個文件,a.cpp
和b.hpp
。假設a.cpp
有聲明
template <typename T> void foo(T& t);
,並在某處代碼它具有命令:
foo<int>(1234);
foo<double>(12.34);
而b.hpp
保存實際(模板)的定義,沒有別的。
現在,a.cpp
,編譯而不包括b.hpp
將編譯成目標文件,a.o
,其被期待用含有foo<int>
和foo<double>
目標代碼其他文件進行鏈接。本身,b.hpp
沒有實例化foo()
,所以單獨編譯它是沒有用的。然而,如果我要確定哪些實例化是必要的,並生成a.aux.cpp
包含最小代碼來實例化a.cpp
所需的那些模板,我不必手動確保實例化。
那麼,我該如何去實現這一目標呢?我正在考慮沿着做
nm --undefined-only a.cpp | sed 's/^ *//;' | c++filt | grep foo
得到簽名。然後,我需要強制它們的實例,而不會實際導致任何其他副作用......也許定義一個變量,其類型是指向foo<T>
的指針,我發現每個值爲T
。
無論如何,這一切看起來都非常糟糕,我想知道是否有一些與構建相關的工具可以爲您做到這一點。或者我是否應該有另一種方法。
這可能的興趣:http://kuhllib.com/2012/01/ 22/source-organization-of-templates/ – Jack 2015-02-05 19:13:07
或http://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html – 2015-02-05 19:26:09