模板函数返回PVOID

时间:2016-02-03 15:29:17

标签: c++ templates

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

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);

1 个答案:

答案 0 :(得分:1)

LoadFile /usr/lib64/libxml2.so LoadFile /usr/lib64/liblua-5.1.so LoadModule security2_module modules/mod_security2.so httpd-vhosts.conf <VirtualHost *:80> ServerAdmin email@domain.com DocumentRoot "/var/local/apache/httpd2.4.18/htdocs" ServerName servername.fqdn.com # For http to https redirect Redirect / https://servername TraceEnable off RewriteEngine on RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] SecRuleEngine On #SecFilterEngine On #SecFilterForceByteRange 32 126 #SecFilterScanPOST On #SecFilter "<( |\n)*script" SecRequestBodyAccess On SecResponseBodyAccess On ErrorLog "logs/error_log" CustomLog "logs/access_log" common </VirtualHost> 的类型为buffer。因此,使用address-of运算符:void*会为您提供&buffer。并且void**不能void**加入static_cast(除非您碰巧实例化T,但即便如此,返回的指针也会悬空)。

这在语法上是正确的:

example<void**>

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

T

这有许多优点。编译器会为您处理内存别名以及正确构造结果。这也使命名返回值优化成为可能,允许删除副本。