статическое утверждение не выполнено: у варианта не должно быть ссылочной альтернативы - PullRequest
0 голосов
/ 06 июня 2018

Я хочу иметь карту, которая содержит ссылки на переменные другого типа.Для этого я использую std::variant вот так:

using foo = std::variant<std::atomic<double> &, std::atomic<int> &, std::string &>;

Это компилируется так далеко с gcc 7.3.0.Используемые флаги компилятора: -Wall -Wextra -Werror -O3 -std=c++17

Добавление этого кода:

using ServerParameter = struct ServerParameter
{
    foo  myVariants;     <---- gcc error
    bool someLogic;
};

нарушает код, и я получаю эту ошибку gcc:

ошибка: статическое утверждение не удалось: у варианта не должно быть ссылочной альтернативы

Мое намерение примерно такое, но пока я не могу, потому что using для ServerParameter уже терпит неудачу:

auto bar() -> void
{    
    std::atomic<double> atom_double;
    std::atomic<int>    atom_int;
    std::string         myString;
    ...
    std::map<std::string, ServerParameter> variableList(
        {
            { {"SomeText1" }, { atom_double; true  } },
            { {"SomeText2" }, { atom_int;    true  } },
            { {"SomeText3" }, { myString;    false } },
        }
    );
    ...
}

Затем я могу очень хорошо обработать элементы в variableList - в зависимости от типа ссылки - с помощью std::visit.


Примечание:

pointer работает вместо reference, экв:

using foo = std::variant<std::atomic<double> *, std::atomic<int> *, std::string *>;

auto bar() -> void
{    
    std::atomic<double> atom_double;
    std::atomic<int>    atom_int;
    std::string         myString;
    ...
    std::map<std::string, ServerParameter> variableList(
        {
            { {"SomeText1" }, { &atom_double; true  } },
            { {"SomeText2" }, { &atom_int;    true  } },
            { {"SomeText3" }, { &myString;    false } },
        }
    );
    ...
}

А потом очень элегантно std::visit:

std::visit( visitHandler             
        {
            [&](std::atomic<double> * enumType) { *enumType = ..an assignment..; },
            [&](std::atomic<int> * enumType)    { *enumType = ..an assignment..; },
            [&](FaF::string * enumType)         { *enumType = ..an assignment..; },
        }, variantEntry );

Мой вопрос:

  1. Что я здесь не так делаю?Я не понимаю сообщение об ошибке, и я ничего не нашел в сети.
  2. Что будет правильным объявлением ServerParameter?

1 Ответ

0 голосов
/ 06 июня 2018

С cppreference.com :

В одном варианте запрещается хранить ссылки, массивы или тип void.Пустые варианты также плохо сформированы (вместо них можно использовать std::variant<std::monostate>).

Так что использование указателей вместо этого было бы правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...