2015-02-05 52 views
1

(這個問題有點晦澀沒有很大的動力,所以請多多包涵。)如何根據目標文件中缺少的符號來實例化模板?

爲了討論方便,我們假設我有兩個文件,a.cppb.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

無論如何,這一切看起來都非常糟糕,我想知道是否有一些與構建相關的工具可以爲您做到這一點。或者我是否應該有另一種方法。

+0

這可能的興趣:http://kuhllib.com/2012/01/ 22/source-organization-of-templates/ – Jack 2015-02-05 19:13:07

+1

或http://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html – 2015-02-05 19:26:09

回答

0

我不認爲有任何東西可以用於開箱即用。您可能會嘗試使用LibClang等工具編寫自己的「需要實例化提取器」。

還要注意的是唯一合法的方式獲得其他翻譯單元使用的實例是要求一個明確的實例:

template void foo(int& t); 
+1

這是最好也是唯一的方法。如果你沒有做明確的實例化,並且沒有在需要隱式實例化的每個翻譯單元中提供的定義,則該代碼是不合格的NDR([temp]/p6)。 – 2015-02-05 19:53:31

+0

@ T.C。謝謝,更新。我想我不應該在9點開始回答。經過艱辛的一天...... – Angew 2015-02-05 19:57:04

+0

你是不是說,'template void foo (int & t);'? – einpoklum 2015-02-05 21:39:41