如何解决是否可以使用不带lambda的std :: visit只是一个简单的类?
我正在尝试用一个简单的类来创建访问者,并为该变体中的每种类型重载operator()。
我希望它可以工作(因为我认为它可以用于lamdba函数):
#include <variant>
#include <iostream>
using Example = std::variant<int,float,bool>;
class ExampleVisitor {
void operator()(int& i) {
std::cout << "Integer: " << i << '\n';
}
void operator()(float& f) {
std::cout << "Float: " << f << '\n';
}
void operator()(bool& b) {
std::cout << "Boolean: " << b << '\n';
}
};
int main() {
Example example = 1234;
ExampleVisitor visitor;
std::visit(visitor,example);
}
但是,编译此代码(在gcc版本9.3.0上)会导致相当隐蔽的错误 error: no type named ‘type’
,我无法真正理解。我认为这与std::visit
可以推断出访问者的返回类型有关,但是我不太确定如何解决此问题。
完整错误:
In file included from visit.cpp:1:
/usr/include/c++/9/variant: In instantiation of ‘constexpr decltype(auto) std::__do_visit(_Visitor&&,_Variants&& ...) [with bool __use_index = false; bool __same_return_types = true; _Visitor = ExampleVisitor&; _Variants = {std::variant<int,bool>&}]’:
/usr/include/c++/9/variant:1654:24: required from ‘constexpr decltype(auto) std::visit(_Visitor&&,_Variants&& ...) [with _Visitor = ExampleVisitor&; _Variants = {std::variant<int,bool>&}]’
visit.cpp:23:30: required from here
/usr/include/c++/9/variant:1634:13: error: no type named ‘type’ in ‘std::conditional_t<false,std::__detail::__variant::__variant_idx_cookie,std::invoke_result<ExampleVisitor&,int&> >’ {aka ‘struct std::invoke_result<ExampleVisitor&,int&>’}
1634 | using _Result_type = typename std::conditional_t<__use_index,| ^~~~~~~~~~~~
/usr/include/c++/9/variant:1638:23: error: no type named ‘type’ in ‘std::conditional<false,int&> >::type’ {aka ‘struct std::invoke_result<ExampleVisitor&,int&>’}
1638 | constexpr auto& __vtable = __detail::__variant::__gen_vtable<
|
解决方法
是的,肯定有可能。问题是,您在ExampleVisitor
中设置的重载为private
,因此std::visit
找不到合适的operator()
来使用(据它所知,没有{{ 1}}个都存在。
您可以通过设置重载集operator()
来解决此问题:
public
或者通过将class ExampleVisitor {
public:
// ... all overloads
};
改成class
来更改默认访问说明。
这里是demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。