c++ - 将数组(变量)作为模板参数传递
问题描述
typedef int INT5[5] ;
template<INT5 i5>
void fun()
{
for (auto i : i5)
{
cout << i << endl;
}
}
void test()
{
int i5[5] = { 2,3,1,2,4 };
fun<i5>();//error
}
我想将数组作为模板参数传递,但失败了。
错误 C2672:“__ExplicitVarTypeTest::fun”:找不到匹配的重载函数
错误 C2971:“__ExplicitVarTypeTest::fun”:模板参数“i5”:“i5”:具有非静态存储持续时间的变量不能用作非类型参数
有人给我一个解决方案,将变量作为有趣的参数而不是模板的参数传递。但在我的情况下,我无法更改函数的参数。因为它是一个回调函数。
实际上,我需要这样做
typedef char MyCharMap[UINT8_MAX];
template<MyCharMap keymap>
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//MSDN说了,nCode<0(HC_ACTION)的都用CallNextHookEx返回
if (nCode >= HC_ACTION)
{
KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
if (keyMap[pStruct->vkCode])
{
switch (wParam)
{
case WM_KEYDOWN:
keybd_event(keyMap[pStruct->vkCode], 0, 0, 0);
break;
case WM_KEYUP:
keybd_event(keyMap[pStruct->vkCode], 0, KEYEVENTF_KEYUP, 0);
break;
default:
throw "other key event";
}
}
return TRUE;
}
//传给系统中的下一个钩子
return CallNextHookEx(keyHook, nCode, wParam, lParam);
}
SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc<keymap1>, theApp.m_hInstance, NULL);
SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc<keymap2>, theApp.m_hInstance, NULL);
解决方案
将模板声明为具有 type 的模板参数int[5]
实际上会导致它具有 type 的模板参数int*
。这类似于函数签名中发生的衰减。要解决此问题,只需声明fun
通过引用获取其数组模板参数:
template<const INT5& i5> void fun();
您想将数组 {2, 3, 1, 2, 4} 作为模板参数传递给fun
. 这是可行的,但它必须遵守 [expr.const]/5 (C++17) 中对泛左值常量表达式的限制;它必须引用具有静态存储持续时间的对象。因此,您应该使i5
静态:
static constexpr int i5[5] = { 2,3,1,2,4 };
fun<i5>(); // this should work
推荐阅读
- selenium - 在自定义条件下在硒中流利等待 - 铬
- php - 有没有基于回显值的PHP查询解决方案
- javascript - Jquery在控制台中工作,但不在复选框启用禁用的实际代码中
- c# - 使用 NLog 记录波斯语消息
- jquery - 我需要取消选中其他持有同一类的单选按钮(当然它们不在同一个组中),
- java - java - 如何使用DocumentFilter和样式修复java swing jtextpane中的自动换行奇怪行为?
- c# - 如何统一使用 SpriteMask 处理对象
- pymol - 如何在 PyMOL 中解析单引号字符
- hadoop - 如何使用 Flume 将 Wireshark 数据写入 HBase
- node.js - 我有三个响应,例如 (/banner)、(/latest)、(/popular),我想发送一个名为 home 的 api