使用std :: bind与std :: visit

问题描述 投票:0回答:1

我正在尝试将std::bindstd::visit一起使用以获得访问者绑定的功能。

我得到一个“没有重载函数的实例”,但我不知道我在绑定方面做错了什么。

我如何利用std::bind捕获访客?

#include <variant>
#include <functional>
#include <iostream>

using Somenum = std::variant<uint64_t, double>;

struct Visitor {
    uint64_t operator()(const uint64_t& num) const {
        return num;
    }
    uint64_t operator()(const double& num) const{
        return 5;
    }
};

int main(int argc, char **argv) {
    const Somenum a = 3.0;
    const Somenum b = (uint64_t)6;
    const Visitor v{};
    const auto f = std::bind(std::visit<Visitor, Somenum>, v, std::placeholders::_1);
    const auto f2 = [&v](Somenum x) {
        return std::visit(v, x);
    };

    std::cout << f(a) << std::endl << f(b)<< std::endl;

    std::cout << f2(a) << std::endl << f2(b) << std::endl;
    return 0;
}

实际上,我希望ff2具有相同的行为

删除调用f的行允许编译所有内容。

c++ c++17 variant stdbind
1个回答
4
投票

我无法解释<unresolved overloaded function type>错误 - 但无论如何你正在做的事情是不正确的。 std::visit需要一堆转发引用,所以std::visit<Visitor, Somenum>是一个函数指针,其类型如下:

decltype(auto)(*)(Visitor&&, Somenum&&);

这些是右值参考。但是你实际上并没有用rvalues调用这个函数,你用lvalues调用它。 const值甚至。所以你想要的版本真的是std::visit<Visitor const&, Somenum const&>。这有效:

auto p = std::visit<Visitor const&, Somenum const&>;
const auto f = std::bind(p, v, std::placeholders::_1);

我不知道为什么你需要预先声明p


这应该有助于明确为什么使用lambda是非常优选的。您不必在模板参数推断之前手动操作才能使其正确!

© www.soinside.com 2019 - 2024. All rights reserved.