c++ - 访问者访问变体并返回不同类型时出错

标签 c++ c++17

#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_outputdata_output_two 返回一个 int,它编译正常。我在这里忽略了什么? Here is a link to a godbolt

编辑:

我想能够做 std::visit(gen_visit, vec[0]) 并得到一个双倍然后可能做一个 std::visit(get_visit, vec [1]) 并得到一个整数。这可能吗?

最佳答案

访问返回单一类型。

您的代码要求它返回两种不同的类型。

它不能那样做。

现在,它返回的单一类型可能反过来是两种类型的变体。但这主要是把 jar 头踢到路上。

{[](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]) );

现在您可以编写一些元编程来推断复合重载/访问的正确返回类型。

但更实际的做法是在第一次访问时简单地进行处理:

std::visit([&](auto&&x){ std::cout<<my_lambda(x)<<"\n";}, data_vec[0] );

关于c++ - 访问者访问变体并返回不同类型时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53144396/

相关文章:

c++ - 未定义对 'rpg::draw_grid(int, int)' 的引用

c++ - 寻找 16 位 x86 编译器

c++ - 在std::function中获取std::future的结果类型

c++ - MFC WebBrowser.Navigate 错误 "A null reference pointer was passed to the stub."

c++ - Bison/Flex Concat 字符 *

c++ - 如何捕获派生(多态)异常对象并将其重新抛出到第二级?

c++ - const unique_ptr 的propagate_const

c++ - 将文件读入 std::vector<std::byte>

c++ - 为什么输入流不识别 Ctrl D 而给出一个无限循环?

c++ - Lambda 复制赋值运算符未定义