使 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;
};