我有一个内部有联合的结构。我怎样才能创建一个应该返回
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++ 中一个函数不能返回多种类型。 | |类型 | |-------- | ------ | |
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
的成员。
旁白:我会建议代码审查和重新设计。