gpt4 book ai didi

c++ - 函数签名的错误类型推导

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:06 25 4
gpt4 key购买 nike

我在开发用于访问 Windows 注册表的模板化 API 时偶然发现了一个奇怪的现象。

我认为我很聪明地“捕获”了 Windows API 的 ascii 和 unicode 版本2 个 t_api 结构( t_api_A 和 t_api_W )的静态 constexpr '变量'。

一切都编译正常,但运行不是那么多(调用“捕获函数”时除外)。所以我用了一段代码(来自 Scott Meyers 的书“Effective Modern C++”)来查看扣除的类型。显然,如果我将那些“函数捕获”放在结构中,它就不起作用,但是一个简单的 auto = ...;在函数内部。

显然我做错了什么,但我不明白为什么我的方法有问题。

这是代码(一些代码被注释掉了,因为它们故意产生错误)

#include<Windows.h>

//==============================================================================
namespace wreg {
//------------------------------------------------------------------------------

using t_oshandle = HKEY;

struct t_api
{
static constexpr
auto open_key = ::RegOpenKeyExA;
// Tried all of these :
// RegOpenKeyExA; &RegOpenKeyExA; (::RegOpenKeyExA); (RegOpenKeyExA); (&RegOpenKeyExA);
//

static
constexpr auto close_key = ::RegCloseKey;
};

//------------------------------------------------------------------------------
} // namespace wreg
//==============================================================================

template < typename T >
struct type_deduced; // see Scott Meyers' "Effective Modern C++"

#define TYPE_DEDUCED( nr , t ) type_deduced< t > dummy_ ## nr

int main ()
{
//type_deduced< decltype(RegOpenKeyExA) > s1;
//TYPE_DEDUCED( 1 , decltype(RegOpenKeyExA) ); // 'dummy_1' uses undefined struct 'type_deduced<LSTATUS (HKEY,LPCSTR,DWORD,REGSAM,PHKEY)>'
//TYPE_DEDUCED( 1a , decltype(::RegOpenKeyExA) ); // 'dummy_1a' uses undefined struct 'type_deduced<LSTATUS (HKEY,LPCSTR,DWORD,REGSAM,PHKEY)>'
//TYPE_DEDUCED( 3 , decltype(wreg::t_api::open_key) ); // 'dummy_3' uses undefined struct 'type_deduced<LSTATUS (__stdcall *const )(HKEY,LPCSTR,DWORD,REGSAM,PHKEY)>'

auto hk = wreg::t_oshandle{};

#define ORIGINAL_APPROACH 0
#ifdef ORIGINAL_APPROACH // faulty version
auto res = wreg::t_api::open_key( HKEY_LOCAL_MACHINE ,"SOFTWARE" ,0 ,KEY_READ ,&hk );
if (res == ERROR_SUCCESS)
{
res = wreg::t_api::close_key( hk );
}
#else // working version
auto open_key = ::RegOpenKeyExA;
auto res = open_key( HKEY_LOCAL_MACHINE ,"SOFTWARE" ,0 ,KEY_READ ,&hk );
if (res == ERROR_SUCCESS)
{
auto close_key = ::RegCloseKey;
res = close_key( hk );
}
#endif

return 0;
}

//==============================================================================

最佳答案

错误已在 VS 2015 RTM 中解决。

关于c++ - 函数签名的错误类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com