将 auto 作为参数传递(用于指向对象的指针)

Passing auto as a parameter (for pointer to object)

我有一个宏:

#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,因此 lambda 可以用作潜在的解决方法,我可以在 阅读,但我对 lambda 不够熟悉,不知道如何执行此操作。有什么想法吗?

这是模板的完美案例,我不明白你为什么要避免它:

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 *