2015-09-01 57 views
1

我正在寫可以使用函子的cuda內核,這些函數是作爲模板參數傳遞的。例如:有沒有辦法避免在很多文件中實例化大量模板?

template<typename Functor> void myKernel(float arg1, float* arg2, Functor f) { 
    // Do stuff that will involve f 
} 

這些函子在頭文件,我包括在每個CPP文件中定義,並且爲每一個我必須與所有的函子實例化所有的內核:

template<> myKernel<Add>(float, float*, Add) 
template<> myKernel<Sub>(float, float*, Sub) 

這是很多代碼重複,我們必須記住爲每個新的函子添加一個新行。 有沒有辦法定義所有這一切?

+0

預處理宏? – Amit

+0

您是否知道顯式實例化? https://msdn.microsoft.com/en-us/library/by56e477.aspx –

+0

我希望有一個不涉及marcros的解決方案。 – Pafnouti

回答

0

只需在頭文件中添加instanciations,而不必每次都記住指定它們。

1

看看extern template declarations.

大約有模板的extern一些微妙的細節,特別是14.7.2.10:

除了內聯函數和類模板特, 顯式實例聲明有效果抑制它們引用的實體的隱式實例化。

這意味着,下面將只抑制其他翻譯單位的非聯成員函數f的實例,但不爲克:

template<typename T> class A { 
public: 
    void g() {} // inline member function 
    void f(); 
}; 

template<typename T> void A::f() {} // non-inline 
相關問題