【发布时间】:2017-12-29 14:35:37
【问题描述】:
我正在尝试将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 的行允许编译所有内容。
【问题讨论】:
-
不要使用需要做
std::get<uint64_t>(s)来获取价值,在某个地方?也许std::holds_alternative<uint64_t>(s)检查变体是否具有该类型,也许?double也是如此。 -
不这么认为。我应该在哪里做?我认为 std::visit 应该可以处理。
-
为什么还要在这里使用
std::bind而不是lambda?您将 C++1z 的最新热度与笨拙的旧东西混合在一起,这些东西首先有助于表明语言中对 lambda 的需求。