使 struct 接受任何类型而不是 float
Make struct accept any type insted of float
我需要修改一个简单的结构来接受多种类型的值参数,如下所示:
struct menuitems_t
{
menuitems_t(std::string name, float* value = 0, int itemtype = menuitemtype::SWITCH)
{
this->name = name;
this->value = value;
this->itemtype = itemtype;
}
std::string name;
float* value;
int itemtype;
};
我试图从中创建模板,但没有成功。
声明其中之一就像 menuitems_t(nameString, val1, type);
我唯一的问题是,如果我想使用 bool 作为引用值,它显然不会接受。 (我可以将其转换为浮点数,但这不是我想要的。)
我应该在其中修改什么以接受任何类型?
您可以使用 void*
,但这是一个非常 C 风格和类型不安全的问题解决方案。
任何其他指针都可以隐式转换为 void
指针,但您需要自己跟踪类型。
struct menuitems_t
{
std::string name;
void* value;
int itemtype;
};
void foo() {
menuitems_t myItems{"name", nullptr, 0};
// ...
}
附带说明一下,您不需要自定义构造函数,只需使用 aggregate-initialization。
最好使用 nullptr
而不是 0
.
使用模板会更加类型安全,但您需要在编译时跟踪类型。
template <typename T>
struct menuitems_t
{
std::string name;
T value; // or T* value if it's still supposed to be a pointer
int itemtype;
};
如果类型数量有限,您可以使用 std::variant
。您也可以只使用 union
,但联合没有像 std::variant
.
这样的运行时类型安全
struct menuitems_t
{
std::string name;
std::variant<float, bool> value;
int itemtype;
};
我需要修改一个简单的结构来接受多种类型的值参数,如下所示:
struct menuitems_t
{
menuitems_t(std::string name, float* value = 0, int itemtype = menuitemtype::SWITCH)
{
this->name = name;
this->value = value;
this->itemtype = itemtype;
}
std::string name;
float* value;
int itemtype;
};
我试图从中创建模板,但没有成功。
声明其中之一就像 menuitems_t(nameString, val1, type);
我唯一的问题是,如果我想使用 bool 作为引用值,它显然不会接受。 (我可以将其转换为浮点数,但这不是我想要的。)
我应该在其中修改什么以接受任何类型?
您可以使用 void*
,但这是一个非常 C 风格和类型不安全的问题解决方案。
任何其他指针都可以隐式转换为 void
指针,但您需要自己跟踪类型。
struct menuitems_t
{
std::string name;
void* value;
int itemtype;
};
void foo() {
menuitems_t myItems{"name", nullptr, 0};
// ...
}
附带说明一下,您不需要自定义构造函数,只需使用 aggregate-initialization。
最好使用 nullptr
而不是 0
.
使用模板会更加类型安全,但您需要在编译时跟踪类型。
template <typename T>
struct menuitems_t
{
std::string name;
T value; // or T* value if it's still supposed to be a pointer
int itemtype;
};
如果类型数量有限,您可以使用 std::variant
。您也可以只使用 union
,但联合没有像 std::variant
.
struct menuitems_t
{
std::string name;
std::variant<float, bool> value;
int itemtype;
};