gpt4 book ai didi

c++ - 从 a_func(A a_in) 转换为 b_func(B b_in) 的函数 (c++)

转载 作者:行者123 更新时间:2023-12-04 15:08:08 24 4
gpt4 key购买 nike

我有一个函数类(称之为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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com