C++ 使用std::bind和std::visit

C++ 使用std::bind和std::visit,c++,c++17,variant,stdbind,C++,C++17,Variant,Stdbind,我试图将std::bind与std::visit结合使用,以获得一个绑定访问者的函数 我得到了一个“没有重载函数的实例”,但我不知道我在绑定方面做错了什么 如何利用std::bind捕获访客 #包括 #包括 #包括 使用Somenum=std::variant; 结构访问者{ uint64_t运算符()(常量uint64_t&num)常量{ 返回num; } uint64_t运算符()(const double和num)const{ 返回5; } }; int main(int argc,字符*

我试图将
std::bind
std::visit
结合使用,以获得一个绑定访问者的函数

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

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

#包括
#包括
#包括
使用Somenum=std::variant;
结构访问者{
uint64_t运算符()(常量uint64_t&num)常量{
返回num;
}
uint64_t运算符()(const double和num)const{
返回5;
}
};
int main(int argc,字符**argv){
常数Somenum a=3.0;
常量Somenum b=(uint64_t)6;
const Visitor v{};
const auto f=std::bind(std::visit,v,std::占位符::_1);
常量自动f2=[&v](Somenum x){
返回std::访问(v,x);
};

std::cout我无法解释
错误-但您所做的无论如何都是不正确的。
std::visit
需要大量转发引用,因此
std::visit
是一个函数指针,其类型类似于:

decltype(auto)(*)(Visitor&&, Somenum&&);
这些都是右值引用。但实际上,您并不是用右值调用此函数,而是用左值调用它。甚至是常量左值。因此,您想要的版本实际上是
std::visit
。这是有效的:

auto p = std::visit<Visitor const&, Somenum const&>;
const auto f = std::bind(p, v, std::placeholders::_1);
auto p=std::visit;
const auto f=std::bind(p,v,std::占位符::_1);
同样,我不确定您为什么需要预先声明
p



这应该能清楚地说明为什么强烈建议使用lambda。您不必在模板参数推导之前手动进行正确的推导!

我无法解释
错误-但您所做的无论如何都是错误的。
std::visit
需要大量转发引用,因此
std::visit
是一个函数指针,其类型类似于:

decltype(auto)(*)(Visitor&&, Somenum&&);
这些都是右值引用。但实际上,您并不是用右值调用此函数,而是用左值调用它。甚至是常量左值。因此,您想要的版本实际上是
std::visit
。这是有效的:

auto p = std::visit<Visitor const&, Somenum const&>;
const auto f = std::bind(p, v, std::placeholders::_1);
auto p=std::visit;
const auto f=std::bind(p,v,std::占位符::_1);
同样,我不确定您为什么需要预先声明
p



希望这能清楚地说明为什么强烈建议使用lambda。您不必在模板参数推导之前手动进行正确的推导!

不必使用needtodo
std::get(s)
在某处获取值?或者
std::holds\u可选方案
检查变量是否持有该类型,也许?与
double
类似。我不这么认为。我应该在哪里做?我认为std::visit应该处理这个问题。为什么你甚至想在这里使用
std::bind
而不是lambda?你把C++1z的最新热度与有助于显示n的笨重旧东西混合在一起首先在语言中为lambda添加eed。不要使用needtodo
std::get(s)
在某处获取值,或者使用
std::holds(s)替代方法
检查变量是否持有该类型,也许?与
double
类似。我不这么认为。我应该在哪里做?我认为std::visit应该处理这个问题。为什么你甚至想在这里使用
std::bind
而不是lambda?你把C++1z的最新热度与有助于显示n的笨重旧东西混合在一起首先,兰博达斯的语言是eed。