访问具有单一状态的变体

时间:2018-09-27 06:47:29

标签: c++ variant visitor

我无法将头部包裹在变体上。

我读到,我可以使用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提供呼叫操作符重载。

如果我尝试为call运算符包括一个通用引用重载,它将完全匹配所有内容,并且不再使用这两个特定的重载

2 个答案:

答案 0 :(得分:2)

我添加了适当的访问者方法,并且它在https://wandbox.org/ c ++ 2a

上对我有效

您的问题是什么?

 CloudBlobClient.ListBlobs(prefix: "test").OfType<CloudBlockBlob>.Select(b=> b.Name).ToList();

答案 1 :(得分:1)

  

不起作用,也不为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

它应该愉快地编译并产生预期的行为。