![]() |
1
5
不存在函数类型的对象。类型将被调整为函数指针,这就是为什么您
将函数调用封装在函数对象(lambda,如果您愿意的话)中,以避免函数指针的开销。 如果您想防止在用户试图传递函数时意外使用调整/衰减的函数指针大小写,那么您可以为函数引用使用已删除的重载。我不知道CTAD是如何实现的,但如果你提供一个功能接口,可以这样做:
编辑:将想法与 Human-Compiler's answer
注意,这将阻止以下操作,并且使用
|
![]() |
2
1
真正从这样的函数中删除“存储”的唯一方法是在编译时使用该值。实现这一点的唯一真正方法是通过非类型模板参数。
工厂函数可以很容易地做到这一点,只需很少的更改,并保持实现的简单性。您只需要接受可调用对象作为模板非类型参数,例如
执行此操作的一种方法是将lambda包装解决方案与现有代码一起使用:
然后以下工作:
这产生了正确的值:
作为一种替代措施,您还可以要求用户将函数本身封装在携带数据的sentinel类型中:
这几乎相当于使用lambda,尽管用户只需要执行以下操作:
关键是函数需要在编译时在某个地方执行。 |
![]() |
3
1
在运行时,将函数指针作为模板参数传递不需要任何空间。例如
使用helper函数,您可以将其与代码结合起来:
这允许您执行以下操作:
|
![]() |
WL_Law · C++要求模板变量数小于N,但失败 1 年前 |
![]() |
rbv · 如何使用std::string成员的默认太空船运算符 2 年前 |
![]() |
iBug · 三向比较运算符与减法有何不同? 7 年前 |
![]() |
Mathieu Van Nevel · C++概念循环 7 年前 |
![]() |
sukovanej · C++标准库将来会包含网络、字符串算法等吗? 7 年前 |