之前我问过这个关于std::variant
的问题。考虑到该变体所包含的类型都可以由std::cout
打印,有没有一种简单的方法来实现访问者?
例如Here,一路下来你有几个lambda表达式来覆盖每一种类型,但是所有的都做同样的事情(除了std::string
):std::cout << arg << ' ';
.有没有办法不重复我自己?
std::visit(overloaded {
[](int arg) { std::cout << arg; },
[](long arg) { std::cout << arg; },
[](double arg) { std::cout << arg; }
// I removed the std::string case
}, v); // v is the std::variant
改为:
std::visit( [](auto arg) { std::cout << arg; }, v);
或者类似的东西:
template<typename T>
void printer(T arg) {std::cout << arg; }
//.......
std::visit(printer, v);
2条答案
按热度按时间lyr7nygr1#
不用抄
这采用
arg
通过(转发)引用。我懒得转发我不在乎它是右值还是左值。模板函数不起作用,因为visit需要一个对象,而模板函数不是函数的对象;在C++中,你(还)不能将重载集的名称作为对象传递。
overload
技巧主要是当您想要分派不同的行为时。你可以做的一件事就是
或
那么我们得到:
其创建表示由令牌X1 M2 N1 X命名的函数的重载集的匿名对象。
sqyvllje2#
我遇到了一个
std::variant
有一个std::monostate
除了一对夫妇不同的std::vector<T>
的问题。而不是重载,我这样解决它:不是最优雅的,但简单,可能会让你想要的地方。