访问者访问变体并返回不同类型时出错
Error with visitor to variant and returning different types
#include <iostream>
#include <vector>
#include <variant>
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>;
class data_output
{
public:
double create_data() { return 1.57;}
};
class data_output_two
{
public:
int create_data() { return 66;}
};
int main()
{
using my_type = std::variant<data_output, data_output_two>;
std::vector<my_type> data_vec;
auto my_lambda = overload{[](data_output& d) {return d.create_data();},
[](data_output_two& d) {return d.create_data();}};
data_vec.emplace_back(data_output{});
data_vec.emplace_back(data_output_two{});
std::cout << std::visit(my_lambda, data_vec[0]) << "n";
}
用这个我得到错误
/usr/include/c++/8.2.1/variant:836:43: error:
invalid conversion from ‘std::__success_type<int>::type (*)(overload<main()::<lambda(data_output&)>, main()::<lambda(data_output_two&)> >&, std::variant<data_output, data_output_two>&)’
{aka ‘int (*)(overload<main()::<lambda(data_output&)>, main()::<lambda(data_output_two&)> >&, std::variant<data_output, data_output_two>&)’}
to ‘double (*)(overload<main()::<lambda(data_output&)>, main()::<lambda(data_output_two&)> >&, std::variant<data_output, data_output_two>&)’ [-fpermissive]
{ return _Array_type{&__visit_invoke}; }
如果我尝试从data_output
和data_output_two
返回一个int
,它编译得很好。我在这里俯瞰什么?这是一个到godbolt 的链接
编辑:
我想做std::visit(gen_visit, vec[0])
,得到一个二重,然后可能做std::visit(get_visit, vec[1])
,获得一个int。这可能吗?
Visit返回单个类型。
您的代码要求它返回两种不同的类型。
它不能那样做。
现在,它返回的单个类型可能是两种类型的变体。但这主要是在路上踢罐子。
{[](data_output& d)->std::variant<int,double> {return d.create_data();},
[](data_output_two& d)->std::variant<int, double> {return d.create_data();}};
有了这个,你必须重新访问才能打印:
std::visit( [](auto&&x){std::cout << x << "n";}, std::visit(my_lambda, data_vec[0]) );
现在,您可以编写一些元编程来推导composit重载/访问的正确返回类型。
但更实际的是,只需在第一次访问时进行处理:
std::visit([&](auto&&x){ std::cout<<my_lambda(x)<<"n";}, data_vec[0] );
相关文章:
- 访问者访问变体并返回不同类型时出错
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 与 tesseract::TessBaseApi() 相关的 Tesseract-OCR 出错(预期的类型说明符)
- 将类指针类型转换为键时出错
- 在 Rcpp 中的字符串类型之间转换时出错
- 为什么双精度数据类型在C++中出错?
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- 将运算符<<与隐式转换的非基本数据类型一起使用时出错
- 缺少类型说明符 - int 假定 声明静态成员后出错
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 确定输入"conscalc: calc"的类型时出错。不能联合编码器。具有不同字段集的结构类型
- 使用 mex 编译库时出错 - __int 64 未命名类型
- 从同一类中的另一个方法调用方法时出错
- 为什么当我们把变量"u"的数据类型从长整型更改为整型时,模幂会出错?
- CRTP 模式 但是在数据结构中存储非同构类型
- 在给定表达式的情况下返回对类型的引用时出错:“cond ?*这个 : 投掷()'
- 使用类作为向量类型时出错 - "Undeclared identifier"
- 为 freebsd 11 编译 gcc4.8.5 时出错: 错误: 未知类型名称 'choke'
- 传递具有依赖嵌套参数类型的模板模板参数时出错