我有一个宏:
#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)
但我知道auto还不能用于函数参数。 GPU代码支持C ++ 14,因此lambdas可以作为我可以在https://stackoverflow.com/a/29945034/7283981阅读的潜在解决方法,但我不熟悉lambdas知道如何做到这一点。有什么想法吗?
答案 0 :(得分: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 *