2017-10-17 57 views
1

我有個宏:傳遞汽車作爲參數(用於指針對象)

#define checkAlloc(ans) checkPointer((ans), __FILE__, __LINE__); 

其用於環繞任何指針分配,以檢查它是有效的(用於GPU設備上檢查內存分配側)。

宏的使用步驟如下:

SomeObject* myObj = checkAlloc(new SomeObject()); 

和checkPointer功能被實現爲:

inline __device__ SomeObject* checkPointer(SomeObject* pointer, char *file, int line) 
{ 
    if (pointer == nullptr) 
    { 
     // do error logging 
    } 
    return pointer; 
} 

現在,它是非常不方便創建功能的新版本爲每種類型我可能分配給的對象。模板也不是一個選項,因爲我希望語法清晰 - 即只在每個分配周圍放置checkAlloc(…)而不是checkAlloc<SomeObject>(…),這是醜陋的,並且希望是不必要的。

理想我想改變checkPointer是:

inline __device__ auto checkPointer(auto pointer, char *file, int line) 

但我明白汽車不能用於函數參數呢。 GPU代碼支持C++ 14,所以lambda可以用作潛在的解決方法,我可以在https://stackoverflow.com/a/29945034/7283981上閱讀,但我不熟悉lambda表達式知道如何執行此操作。有任何想法嗎?

+2

模板函數具有參數推導功能。什麼是「不清楚」?你在這裏似乎沒有什麼誤解。 – StoryTeller

+0

事實上,'checkAlloc (...)'*將是不必要的,因爲指針的類型可以被自動推斷出來。 –

+0

模板應該按照你想要的來做。除非不可扣除,否則在調用模板時不必指定類型。在這種情況下,您可以像使用普通功能一樣使用它。 – NathanOliver

回答

3

這是一個模板完美的情況下,我不明白你爲什麼要設法避免它:

template < typename T > 
inline __device__ T* checkPointer(T* pointer, const char *file, int line) 
{ 
    if (pointer == nullptr) 
    { 
    // do error logging 
    } 

    return pointer; 
} 

這是非常明確的,乾淨,好像有一個auto你可以用它有:

int main(int argc, char** argv) 
{ 
    SomeObject* myObj = checkAlloc(new SomeObject()); 
} 

正如你所看到的,有自動參數推導能力,甚至不需要任何類型的規格...

哦,通知我將char * file更改爲const char * file,因爲C++ 11不允許將文字轉換爲char *

+0

甚至'auto myObj = checkAlloc(new SomeObject());' – dcrivelli

+0

@dcrivelli,當然:) –

+0

謝謝大家 - 我顯然需要再次閱讀Meyers。 – user7283981