代码之家  ›  专栏  ›  技术社区  ›  john_smith_lon

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

  •  1
  • john_smith_lon  · 技术社区  · 8 年前

    我有一个宏:

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

    它用于环绕任何指针分配以检查其是否有效(用于检查GPU设备侧的内存分配)。

    宏的使用方式如下:

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

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

    现在,为我可能分配给的每种类型的对象创建新版本的函数非常不方便。模板也不是一个选项,因为我希望语法清晰-即,只是把 checkAlloc(…) 围绕每个分配,而不是 checkAlloc<SomeObject>(…) 这是丑陋的,希望没有必要。

    理想情况下,我希望将检查点更改为:

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

    但我知道auto还不能用于函数参数。GPU代码支持C++14,因此lambdas可以用作我可以在 https://stackoverflow.com/a/29945034/7283981 但我对lambdas不够熟悉,不知道如何做到这一点。有什么想法吗?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Daniel Trugman    8 年前

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

    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 *