(如何)我可以在一处推断模板类型参数并在其他地方“仅使用”推断的类型吗?

Bol*_*pat 2 c++ templates type-deduction

我的函数模板有(除其他外)一个函数指针(或成员函数指针)参数。函数指针可以接受任何参数,参数类型正在被推断。在参数列表的末尾,我希望函数模板采用与函数指针参数相同的参数。

\n
template<typename R, typename... Args>\nvoid f(R(*fp)(Args...), Args... args);\n
Run Code Online (Sandbox Code Playgroud)\n

当参数类型不完全匹配时,问题就开始了,例如 let\xe2\x80\x99s 说fp接受 aBase*并且调用者给f你 aDerived*fp接受 adouble并且调用者放入0(类型为int)。

\n

有什么方法可以告诉编译器Args仅基于fp\xe2\x80\x9c 进行推断并仅使用 \xe2\x80\x9d 这些推断类型,args而不是尝试根据它们绑定到的参数来匹配它们?

\n

Bol*_*pat 6

我找到了一个有效的解决方案。我不知道的术语是非推导上下文。例如,范围解析运算符左侧的所有内容::都是不可推导的。在 C++20 中,您可以使用std::type_identity_t人工创建这样的上下文,在 C++14 和 C++17 中,您可以创建自己的type_identity_t.

\n

所以,你\xe2\x80\x99d使用

\n
template<typename R, typename... Args>\nvoid f(R(*fp)(Args...), std::type_identity_t<Args>... args);\n
Run Code Online (Sandbox Code Playgroud)\n

关于完美转发,当fp通过引用或值获取参数时,f也会执行相同的操作。使用 时std::forward,将移动按值参数并引用引用参数。

\n