Bol*_*pat 2 c++ templates type-deduction
我的函数模板有(除其他外)一个函数指针(或成员函数指针)参数。函数指针可以接受任何参数,参数类型正在被推断。在参数列表的末尾,我希望函数模板采用与函数指针参数相同的参数。
\ntemplate<typename R, typename... Args>\nvoid f(R(*fp)(Args...), Args... args);\nRun Code Online (Sandbox Code Playgroud)\n当参数类型不完全匹配时,问题就开始了,例如 let\xe2\x80\x99s 说fp接受 aBase*并且调用者给f你 aDerived*或fp接受 adouble并且调用者放入0(类型为int)。
有什么方法可以告诉编译器Args仅基于fp\xe2\x80\x9c 进行推断并仅使用 \xe2\x80\x9d 这些推断类型,args而不是尝试根据它们绑定到的参数来匹配它们?
我找到了一个有效的解决方案。我不知道的术语是非推导上下文。例如,范围解析运算符左侧的所有内容::都是不可推导的。在 C++20 中,您可以使用std::type_identity_t人工创建这样的上下文,在 C++14 和 C++17 中,您可以创建自己的type_identity_t.
所以,你\xe2\x80\x99d使用
\ntemplate<typename R, typename... Args>\nvoid f(R(*fp)(Args...), std::type_identity_t<Args>... args);\nRun Code Online (Sandbox Code Playgroud)\n关于完美转发,当fp通过引用或值获取参数时,f也会执行相同的操作。使用 时std::forward,将移动按值参数并引用引用参数。