c++ - 将数组(变量)作为模板参数传递

标签 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
    }

我想传递一个数组作为模板参数,但是失败了。

error C2672: '__ExplicitVarTypeTest::fun': no matching overloaded function found

error C2971: '__ExplicitVarTypeTest::fun': template parameter 'i5': 'i5': a variable with non-static storage duration cannot be used as a non-type argument

有人给我一个解决方案,将变量作为有趣的参数而不是模板的参数传递。但在我的情况下,我无法更改函数的参数。因为它是一个回调函数。

其实我需要这样做

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

最佳答案

将模板声明为具有 int[5] 类型的模板参数实际上会导致它具有 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

关于c++ - 将数组(变量)作为模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50754525/

相关文章:

c++ - 用 Eigen 3 计算数组的特征值/vector 而不是矩阵

c++ - 如何在linux中重复一个进程(或设置一段进程)?

c++ - 将 char[] 附加到具有特定长度的 std::string

c++ - 添加一个指向多个 boost::ptr_vector 列表的指针时崩溃

c++ - 我怎样才能在 vector 中有一对引用?

c++ - 从动态数组中删除一个元素

c++ - 将 C++ 字符串转换为 NSString

c++ - C++替换功能

c++ - 如何使用 C 编程从 dbus 传递/返回结构?

c++ - 使用默认参数的宏包装函数调用