Заставьте struct принять любой тип, вставленный в float - PullRequest
1 голос
/ 03 февраля 2020

Мне нужно изменить простую структуру, чтобы она принимала несколько типов параметров-значений, как показано ниже:

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 в качестве ссылочного значения, он, очевидно, не примет его. (Я могу разыграть его как float, но это не то, что я хочу.) Что я должен изменить в нем, чтобы принимать любые типы?

1 Ответ

0 голосов
/ 03 февраля 2020

Вы можете использовать void*, но это очень небезопасное решение проблемы в стиле C. Любой другой указатель может быть неявно преобразован в void -точку, но вы должны сами следить за типом. просто используйте агрегатная инициализация . И лучше использовать 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;
};
...