访问具有单态的变体

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

它应该很高兴地编译并产生预期的行为。

【讨论】:

确实如此,奇怪,也许我昨天晚上太累了。非常感谢你们。

以上是关于访问具有单态的变体的主要内容,如果未能解决你的问题,请参考以下文章

单态模式其他模式

单态(单例)设计模式

单态(单例)设计模式

java单态学习

java中单态模式或单例模式(Singleton)有什么意义?

Spring 实现两种设计模式:工厂模式和单态模式