让boost.variant支持lambda表达式访问
2024-10-10 21:38:48
前言
之前写个过一篇博客叫《浅谈boost.variant的几种访问方式》,里面讲到了可以通过访问者方式来获取variant的值,但是在重载函数operator()
里面只能够获取variant的值,如果要捕获外部变量或调用外部函数比较麻烦,那么有没有一种方法来简化variant的访问呢?当然有,下面我们让variant支持lambda表达式访问(个人博客也发表了《让boost.variant支持lambda表达式访问》)。
代码
#include <iostream>
#include <string>
#include <utility>
#include <type_traits>
#include <boost/variant.hpp>
template<typename Function, typename... Args>
struct make_overload_impl : make_overload_impl<Function>::type,
make_overload_impl<Args...>::type
{
using type = make_overload_impl;
using make_overload_impl<Function>::type::operator();
using make_overload_impl<Args...>::type::operator();
constexpr explicit make_overload_impl(Function&& func, Args&&... args)
: make_overload_impl<Function>::type(std::forward<Function>(func)),
make_overload_impl<Args...>::type(std::forward<Args>(args)...)
{}
};
template<typename Function>
struct make_overload_impl<Function>
{
using type = Function;
};
template<typename Return, typename... Args>
struct make_overload_impl<Return(*)(Args...)>
{
using type = make_overload_impl;
using Function = Return(*)(Args...);
constexpr explicit make_overload_impl(const Function&& func) : _func(func) {}
constexpr Return operator()(Args&&... args) const
{
return _func(std::forward<Args>(args)...);
}
private:
Function _func;
};
struct make_overload
{
template<typename... Function, typename Overload =
typename make_overload_impl<typename std::decay<Function>::type...>::type>
constexpr Overload operator()(Function&&... func) const
{
return Overload(std::forward<Function>(func)...);
}
};
template<typename... Args>
auto make_visitor(Args&&... args)
{
return make_overload()(std::forward<Args>(args)...);
}
int main()
{
auto visitor = make_visitor
(
[](int& i) { std::cout << i << std::endl; },
[](std::string& i) { std::cout << i << std::endl; }
);
boost::variant<int, std::string> v;
v = "Hello world";
boost::apply_visitor(visitor, v);
v = 100;
boost::apply_visitor(visitor, v);
return 0;
}
该代码也上传到了我的github。
参考资料
最新文章
- .apache2 设置多个虚拟域名
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表
- Notes of the scrum meeting(10/30)
- 一位Erlang程序员的自白
- C#List<;long>;与String(Linq)
- 使用GitHub+hexo搭建个人独立博客
- JavaScript 字符串(String)对象
- too many open files linux服务器 golang java
- redis的三种集群方式
- turtle库的学习
- JS 的execCommand 方法 做的一个简单富文本
- maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题
- 目标检测-yolo2
- 架构 : 三层架构、MVC、MVP、MVVM
- 题目1162:I Wanna Go Home(最短路径问题进阶dijkstra算法))
- socket编程时SIGPIPE信号的处理
- icanhazip.com 使你在不论什么地方知道你的公网IP地址
- [置顶]
 【机器学习PAI实践八】用机器学习算法评估学生考试成绩
- Luogu3387 缩点 【tarjan】【DP】
- pyspider用PyQuery解析页面数据