gpt4 book ai didi

c++ - 一个函数可以返回一个指向它自己类型的指针吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:51 24 4
gpt4 key购买 nike

我在一个类中实现了一个非常小的有限状态机,我最初的方法是尝试这个:

class Widget {
public:
void update(float time_interval){
current_state = current_state_(time_interval);
}
private:
std::function< ?? > off_(float);
std::function< ?? > standby_(float);
std::function< ?? > locked_(float);

std::function< ?? > current_state_; // initialised to off_
};

每个状态都是一个返回状态的函数。但是我不知道如何声明一个函数,其返回类型包括它的返回类型。有没有办法打破递归?

相反,我使用了一个 enum class 和一个丑陋的 switch 语句。

最佳答案

如果我没理解错的话,你想返回一个函数引用到状态链中的下一个函数,并且所有状态步函数都具有相同的签名?

我看到这里的问题是返回类型是函数本身,所以声明函数的类型会调用递归类型定义。

因此,您想编写 RetType fn_(float) 形式的函数,但 RetType 的类型(基本上)是 RetType fn_(float)。所以现在我们有了 (RetType (*)(float)) fn_(float) 或类似的东西,但是无论我们多么努力,我们都无法摆脱 RetType。

如果不进行前向声明,就无法关闭该递归。我们可以转发声明类并使用它们,所以让我们为您的函数指针编写一个简单的类包装器,这可能就是@Jarod 所暗示的。现在,std::function 是函数的类包装器,但它需要显式类型声明,而我们没有。

class Widget;
class StateFn;
class StateFn
{
Widget * THIS;
StateFn (Widget::*Fn)(float);
public:
/// Or you could rely on POD construction
StateFn(Widget * THIS, StateFn (Widget::*Fn)(float))
: THIS(THIS), Fn(Fn)
{}
StateFn operator()(float f)
{
return THIS->*fn(f);
}
};

所以现在递归定义被打破了,我们的状态函数可以返回 StateFn 对象,我们可以调用它们。

关于c++ - 一个函数可以返回一个指向它自己类型的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575096/

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