首页 > 解决方案 > 使结构接受任何类型的浮点数

问题描述

我需要修改一个简单的结构来接受多种类型的值参数,如下所示:

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 作为引用值,它显然不会接受它。(我可以将它转换为浮点数,但这不是我想要的。)我应该在其中修改什么以接受任何类型?

标签: c++templatesstructdeclaration

解决方案


您可以使用void*,但这是一个非常 C 风格和类型不安全的问题解决方案。任何其他指针都可以void隐式转换为 -pointer,但您需要自己跟踪类型。

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. 您也可以只使用 a union,但联合没有像std::variant.

struct menuitems_t
{
    std::string name;
    std::variant<float, bool> value;
    int itemtype;
};

推荐阅读