我想要一个包含对不同类型变量的引用的映射。为此,我使用std::variant这样的:
using foo = std::variant<std::atomic<double> &, std::atomic<int> &, std::string &>;
Run Code Online (Sandbox Code Playgroud)
使用 gcc 7.3.0 编译到此为止。使用的编译器标志:-Wall -Wextra -Werror -O3 -std=c++17
添加此代码:
using ServerParameter = struct ServerParameter
{
foo myVariants; <---- gcc error
bool someLogic;
};
Run Code Online (Sandbox Code Playgroud)
破坏代码,我收到此 gcc 错误:
错误:静态断言失败:变体必须没有参考替代方案
我的意图是这样的 - 但目前我不能,因为usingforServerParameter已经失败了:
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 } },
}
);
...
}
Run Code Online (Sandbox Code Playgroud)
variableList然后,我可以根据引用的类型很好地处理 中的项目std::visit。
笔记:
pointer 代替, eq起作用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 } },
}
);
...
}
Run Code Online (Sandbox Code Playgroud)
然后是非常优雅的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 );
Run Code Online (Sandbox Code Playgroud)
我的问题:
ServerParameter?不允许变体保存引用、数组或 void 类型。空变体也是格式错误的(
std::variant<std::monostate>可以改为使用)。
所以使用指针代替是正确的。