C++ 从函数-C+返回多个可能的类型+;

C++ 从函数-C+返回多个可能的类型+;,c++,oop,C++,Oop,我正在为我的申请制作一个输入系统。我目前有一个InputManager类,它存储一个InputAction实例列表。我希望能够在InputManager上有一个函数,从它的任何输入操作中获取一些值。问题是,我想让InputAction的子对象返回不同类型的值。例如,对于按键,我希望KeyInputAction返回布尔值,而MouseMoveInputAction应该返回浮点向量。这是可能的还是糟糕的设计 template <class T> class InputA

我正在为我的申请制作一个输入系统。我目前有一个InputManager类,它存储一个InputAction实例列表。我希望能够在InputManager上有一个函数,从它的任何输入操作中获取一些值。问题是,我想让InputAction的子对象返回不同类型的值。例如,对于按键,我希望KeyInputAction返回布尔值,而MouseMoveInputAction应该返回浮点向量。这是可能的还是糟糕的设计


    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
可以操作的对象而不是试图取出一个对象是否有意义。这是完全可能的,而且几乎就是面向对象编程的全部内容。构造事物的一种简单方法是,让每个输入返回一个枚举值,该值描述了它是什么类型的操作,以便查看该操作的任何人都可以确定如何处理它。这将允许您完全避免使用模板,并且如果愿意,您可以构建只获取您感兴趣的输入类型的访问器。