访问具有单态的变体
Posted
技术标签:
【中文标题】访问具有单态的变体【英文标题】:Visit a variant with a monostate 【发布时间】:2018-09-27 06:47:28 【问题描述】:我无法理解变体。
我读到,我可以使用 std::monostate 来暗示空状态作为变体内部的替代方案之一。但是,我该如何使用由 std::visit 提供的访问者模式?
#include <variant>
struct Visitor
void operator()(double);
void operator()(int);
;
int main()
std::variant<std::monostate, int, double> v = 1;
std::visit(Visitor, v);
不起作用,也没有为 std::monostate 提供调用运算符重载。
如果我尝试为调用运算符包含一个通用引用重载,它只会匹配所有内容并且不再使用两个特定重载
【问题讨论】:
无法复制:godbolt.org/z/GAPn3v 【参考方案1】:我添加了适当的访问者方法,它适用于https://wandbox.org/ c++2a
你有什么问题?
#include <iostream>
#include <variant>
struct Visitor
void operator()(double) std::cout << "Double!" << std::endl; ;
void operator()(int) std::cout << "Int!" << std::endl; ;
// that was missing:
void operator()(std::monostate) std::cout << "Mono!" << std::endl; ;
;
int main()
std::variant<std::monostate, int, double> v = 1;
std::variant<std::monostate, int, double> w;
std::visit(Visitor, v);
std::visit(Visitor, w);
【讨论】:
【参考方案2】:不起作用,也没有为 std::monostate 提供调用运算符重载。
std::monostate
上的额外重载确实对我有用:
struct Visitor
void operator()(double)
void operator()(int)
void operator()(std::monostate)
;
这样使用时
std::variant<std::monostate, int, double> v = 1;
std::visit(Visitor, v); // invokes the int overload
v= 1.234;
std::visit(Visitor, v); // ... and the double overload
v = std::monostate;
std::visit(Visitor, v); // ... and finally the std::monostate overload
它应该很高兴地编译并产生预期的行为。
【讨论】:
确实如此,奇怪,也许我昨天晚上太累了。非常感谢你们。以上是关于访问具有单态的变体的主要内容,如果未能解决你的问题,请参考以下文章