C++允许非类型模板参数为指针,包括函数指针、类型。我最近问了一个关于这有什么用的问题,这是对其中一个答案的跟进。
是否可以从作为相关函数指针的函数参数中推断出函数指针模板参数的值?例如:
using VoidFunction = void(*)();
template <VoidFunction F>
void templ(VoidFunction);
...
void func(); // a VoidFunction
...
templ<func>(func); // works, but I have to specify the template parameter explicitly
templ(func); // <-- I would like to be able to do this
有没有办法让这个扣除发生?从编译器实现者的角度来看,这在技术上似乎是可行的,只要函数参数可以在编译时解析为代码中的函数。
如果您想知道这背后的动机,请参阅此答案下的评论,特别是对std::bind()
.
编辑:我意识到我可以简单地删除函数参数并使用模板参数,如templ<func>()
. 我添加函数参数的唯一目的是尽量避免传递模板参数。
我想我真正想要的是也推断出函数指针的类型,如:
template <typename Function, Function F>
void templ(/* something */);
然后就可以打电话了
templ(func);
或者
templ<func>();
并从函数指针的一次提及中推断出类型和值。
希望现在更有意义。