函数可以将指针返回其自己的类型
Can a function return a pointer to its own type?
我已经在类中实现了一台非常最小的有限状态机,我的原始方法是尝试以下方法:
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 ::函数是您功能的类包装器,但是它需要明确的类型声明,我们没有。
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);
}
};
因此,现在递归定义被打破,我们的状态函数可以返回状态FN对象,我们可以致电它们。
我找到了一个解决方案 - 使用 std::unordered_map
替代丑陋的 switch
:
class Widget {
public:
enum class State { Off, Standby, Locked };
void update(float time_interval) {
current_state_ = (this->*state_fn_.at(state_))(time_interval);
}
private:
State off_(float) {return ::has_power() ? State::Standby : State::Off;}
State standby_(float);
State locked_(float);
const std::unordered_map<State, State(Widget::*)(float)> state_fn_{
{State::Off, &Widget::off_},
{State::Standby, &Widget::standby_},
{State::Locked, &Widget::locked_}};
State current_state_{State::Off};
};
只有1 3n行的代码比我在问题中提出的理想代码差 - 我对此非常满意!
相关文章:
- 您应该在什么时候创建自己的异常类型
- 设计自己的结果/两者之一:是否应该始终指定成功类型和错误类型
- 您自己的类型的结构化绑定,不是结构或元组(通过公共成员函数)
- 类模板,在定义中引用其自己的类型
- (如何)在提升几何中创建自己的多边形类型并与之一起使用multi_polygon类型?
- 返回自己的类型的模板类方法的正确签名
- 函数可以将指针返回其自己的类型
- 使用库时的标准 - 使用库的数据类型 VS 创建我自己的类型?
- 如何为自己的类型声明自定义char_traits<>?
- "could not convert template argument"到自己的类型
- C++ std::函数,返回它自己的类型(再次递归类型)
- Buit矩形(我自己的类型),不会随窗口调整大小
- Q与自己的类型工作进行比较
- C++:一个类可以有它自己的类型的对象吗?
- 模板类专用化以处理其自己的类型
- 类自己的类型的静态类成员
- 如何声明为属性,指针到自己的类型,使用模板
- 如何用自己的类型实例化超类模板
- 递归typedef函数定义:std::函数返回自己的类型
- 我可以添加自己的类型转换操作符,以便能够将c++对象转换为objective C吗?