C++ 从函数-C+返回多个可能的类型+;
我正在为我的申请制作一个输入系统。我目前有一个InputManager类,它存储一个InputAction实例列表。我希望能够在InputManager上有一个函数,从它的任何输入操作中获取一些值。问题是,我想让InputAction的子对象返回不同类型的值。例如,对于按键,我希望KeyInputAction返回布尔值,而MouseMoveInputAction应该返回浮点向量。这是可能的还是糟糕的设计C++ 从函数-C+返回多个可能的类型+;,c++,oop,C++,Oop,我正在为我的申请制作一个输入系统。我目前有一个InputManager类,它存储一个InputAction实例列表。我希望能够在InputManager上有一个函数,从它的任何输入操作中获取一些值。问题是,我想让InputAction的子对象返回不同类型的值。例如,对于按键,我希望KeyInputAction返回布尔值,而MouseMoveInputAction应该返回浮点向量。这是可能的还是糟糕的设计 template <class T> class InputA
template <class T>
class InputAction
{
public:
InputAction(std::string name);
~InputAction();
template <class T>
virtual T GetValue();
protected:
std::string m_Name;
};
class InputManager
{
public:
InputManager();
~InputManager();
template <typename T>
T GetValue(std::string actionName);
private:
std::hash_map<std::string, InputAction*> m_InputActionMap;
};
template <typename T>
T InputManager::GetValue(std::string actionName)
{
InputAction* action = m_InputActionMap.at(actionName);
auto value = action->GetValue();
return value;
}
模板
类输入
{
公众:
输入(std::字符串名称);
~inputation();
模板
虚拟T GetValue();
受保护的:
std::字符串m_名称;
};
类输入管理器
{
公众:
InputManager();
~InputManager();
模板
T GetValue(std::string actionName);
私人:
std::hash_映射m_输入映射;
};
模板
T InputManager::GetValue(std::string actionName)
{
InputAction*action=m_InputActionMap.at(actionName);
自动值=操作->获取值();
返回值;
}
如果你能将可能性限制在一个合理的数字,返回std::variant
是一个选项,但我不喜欢这个想法。看看访问者模式背后的想法。看看传入一个InputManager
可以操作的对象而不是试图取出一个对象是否有意义。这是完全可能的,而且几乎就是面向对象编程的全部内容。构造事物的一种简单方法是,让每个输入返回一个枚举值,该值描述了它是什么类型的操作,以便查看该操作的任何人都可以确定如何处理它。这将允许您完全避免使用模板,并且如果您愿意,您可以构建只获取您感兴趣的输入类型的访问器。如果您可以将返回std::variant
的可能性限制在合理的数量,则可以选择返回std::variant
,但我不喜欢这种想法。看看访问者模式背后的想法。看看传入一个InputManager
可以操作的对象而不是试图取出一个对象是否有意义。这是完全可能的,而且几乎就是面向对象编程的全部内容。构造事物的一种简单方法是,让每个输入返回一个枚举值,该值描述了它是什么类型的操作,以便查看该操作的任何人都可以确定如何处理它。这将允许您完全避免使用模板,并且如果愿意,您可以构建只获取您感兴趣的输入类型的访问器。