访问具有单状态的变体
Visit a variant with a monostate
我很难理解变体。
我读到,我可以使用 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 提供调用运算符重载也不起作用。
如果我尝试为呼叫运算符包含一个通用引用重载,它只会匹配所有内容,不再使用两个特定的重载
我添加了正确的访问者方法,它适用于 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);
}
不起作用,为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
它应该愉快地编译并产生预期的行为。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 访问具有单状态的变体
- 如何在单例类中管理变量状态?
- 无法恢复我的安卓 c++ 游戏的状态(状态>保存状态始终为空)
- 在MFC中以编程方式设置单选按钮状态
- 在进行 OOP 状态机设计时如何避免单例
- 多线程插件体系结构中的共享、单侧可变状态
- 状态机状态之间的通信
- 如何使系统进入睡眠状态并再次自动(以编程方式)从睡眠状态恢复,而无需任何手动"鼠标单击或键盘点击"
- 如何在cocos2d-x中将按钮的状态更改为已单击
- 检测表单中任何小部件的状态是否发生了变化
- 如何使复选框在单击时更改其状态