返回 PVOID 的模板函数

Template function returning PVOID

本文关键字:函数 PVOID 返回      更新时间:2023-10-16

不确定是否可以做到这一点。我下面有一个示例函数,需要返回模板

template <class T>
T example(DWORD DW)
{
    PVOID buffer;
    // my code is here sets the buffer
    return static_cast<T>(&buffer);
}

想这样使用它

int iReturn = example<int>(dwSomeDword);

buffer的类型是void* 。因此,使用地址运算符:&buffer给你一个void**。并且void**不能static_castT中(除非你碰巧实例化了example<void**>,但即使这样,返回的指针也会晃来晃去)。

这在语法上是正确的:

return *static_cast<T*>(buffer);

该程序将 void 指针强制转换为指向T的指针,然后取消引用它。但是没有必要进行这种诡计。只需首先创建一个T,对其进行操作,然后返回它:

T result;
// my code is here sets the result
return result;

这具有多种优势。编译器会为您处理内存别名,并正确构造结果。这也使得命名返回值优化成为可能,从而允许省略副本。