我正在尝试将std::bind
与std::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;
}
有效地我希望f
和f2
具有相同的行为
删除称为f
的线允许所有内容编译。
我无法解释<unresolved overloaded function type>
错误 - 但是无论如何您所做的事情是不正确的。std::visit
采用一堆转发引用,因此std::visit<Visitor, Somenum>
是一个功能指针,其类型为:
decltype(auto)(*)(Visitor&&, Somenum&&);
这些是RVALUE参考。但是您实际上并没有使用RVALUE调用此功能,而是使用LVALUE调用它。甚至const lvalues。因此,您想要的版本确实是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是强烈的首选。您不必在模板参数扣除之前手动即可扣除它!