Я хочу иметь карту, которая содержит ссылки на переменные другого типа.Для этого я использую 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 );
Мой вопрос:
- Что я здесь не так делаю?Я не понимаю сообщение об ошибке, и я ничего не нашел в сети.
- Что будет правильным объявлением
ServerParameter
?