如何制作 get_data() 函数?

问题描述 投票:0回答:1

我有一个内部有联合的结构。我怎样才能创建一个应该返回

get_data()
if(value == input_value::_bool) 的
bool
函数。

enum class input_value {
    _bool,
    _1D,
    _2D,
    _3D,
};

struct input_action {

    union input_action_data {
        bool boolean;
        f32 _1D;
        glm::vec2 _2D;
        glm::vec3 _3D{};
    };

    input_value value;
    input_action_data data;

}

这样的模板不起作用:

template <typename T>
data get_data() const {

    static_assert(std::is_same<T, bool>::value || std::is_same<T, f32>::value || std::is_same<T, glm::vec2>::value,
        "Unsupported data type");

    switch (value) {
    case PFF::input_value::_bool:
        return data.boolean;

    case PFF::input_value::_1D:
        return data._1d;

    case PFF::input_value::_2D:
        return data._2d;

    case PFF::input_value::_3D:
        return data._3d;

    default:
        return T{};
    }
}

我不想要这个:

example_input_action->get_data<bool>()
example_input_action->get_data_bool()
c++ templates
1个回答
0
投票

C++ 中一个函数不能返回多种类型。 | |类型 | |-------- | ------ | |

data.boolean
|
bool
| |
data._1d
|
f32
| |
data._2d
|
glm::vec2
| |
data._3d
|
glm::vec3
| |
T{}
|
template parameter
| 这些是 switch 语句中有条件返回的类型。

其次

data
是成员变量而不是类型。

即使您将函数签名更改为:

template <typename T>
input_action_data get_data() const;

此行将不允许编译:

default:
    return T{};
}

因为

T
不是返回的
union
的成员。

旁白:我会建议代码审查和重新设计。

© www.soinside.com 2019 - 2024. All rights reserved.