- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数类(称之为AFunc
),它接受一个A
类型的参数,还有一类函数(称之为BFunc
) 接受类型 B
的并行参数(即从类型 A
的对象直接转换为类型 B
的对象) .
我需要编写如下函数:
using Afunc = AReturnType(*)(A);
using BFunc = BReturnType(*)(B);
BFunc convertFunction(AFunc a_func_in)
{
BReturnType(*b_func_out) =
[&](B b_in) {
A a_in = A(b_in);
AReturnType a_out = a_func_in(a_in);
return BReturnType(a_out);
};
return b_func_out;
}
也就是说,一个函数接受一个与 A
类型兼容的函数并返回一个与 B
类型兼容的函数。
我的第一个想法是在转换函数中定义一个函数,但我很快发现 c++ 不支持局部函数。我的下一个想法是使用上面的 lambda 表达式,但我后来了解到,如果 lambda 函数不捕获任何引用,它们只能衰减为函数指针,但是在这种情况下,lambda 需要知道 AFunc
参数提供给更广泛的转换功能。
这就是我没有想法的地方。还有其他方法吗?
最佳答案
问题在于拥有一个函数指针比仅仅拥有一个可调用对象更强大。后者可以是函数指针,但也可以是闭包或仿函数,两者都带有状态。函数指针就是:指向函数的指针。没有状态,没有特殊的技巧。只需一段代码即可按需执行。
所以,至少,没有办法传递 AFunc
在运行时得到一个 BFunc
,您定义所有内容的方式,因为这将涉及在运行时在代码本身中生成新函数,这是 C++ 不允许的。
但是,如果您知道 AFunc
你也想在编译时应用它,我们可以使用模板来获得相同的结果。模板在编译时进行评估并实际生成代码,因此我们可以使用它来提出具有真正函数指针的函数。事实上,我们甚至不打算编写转换函数;我们只是要写我们的BFunc
然后模板参数化它。
template <AFunc f>
BReturnType bFunc(B b) {
return f(b);
}
假设存在适当的转换,您可以编写类似 BFunc b = bFunc<sampleAFunc>;
的内容编译器将为您生成适当的函数(和相应的指针)。
关于c++ - 从 a_func(A a_in) 转换为 b_func(B b_in) 的函数 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65695164/
我是一名优秀的程序员,十分优秀!