前言

之前写个过一篇博客叫《浅谈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

参考资料

让BOOST.VARIANT的VISIT支持LAMBDA

最新文章

  1. .apache2 设置多个虚拟域名
  2. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(31)-MVC使用RDL报表
  3. Notes of the scrum meeting(10/30)
  4. 一位Erlang程序员的自白
  5. C#List&lt;long&gt;与String(Linq)
  6. 使用GitHub+hexo搭建个人独立博客
  7. JavaScript 字符串(String)对象
  8. too many open files linux服务器 golang java
  9. redis的三种集群方式
  10. turtle库的学习
  11. JS 的execCommand 方法 做的一个简单富文本
  12. maven dependcymanage作用在父类里面定义依赖包 子类不会自动继承需要主动使用 这样解决了父类引用任意包 子类就会引用的问题
  13. 目标检测-yolo2
  14. 架构 : 三层架构、MVC、MVP、MVVM
  15. 题目1162:I Wanna Go Home(最短路径问题进阶dijkstra算法))
  16. socket编程时SIGPIPE信号的处理
  17. icanhazip.com 使你在不论什么地方知道你的公网IP地址
  18. [置顶] 【机器学习PAI实践八】用机器学习算法评估学生考试成绩
  19. Luogu3387 缩点 【tarjan】【DP】
  20. pyspider用PyQuery解析页面数据

热门文章

  1. js原型链和继承
  2. 160616、jQuery插件之ajaxFileUpload及jqueryeasyui学习资料分享
  3. CSS Sprites 原理技术介绍及其优化方法
  4. Python进阶知识
  5. jquery的常用知识点
  6. 自定义HTTP头时的注意事项(转)
  7. 前端 javascript 变量
  8. 本书版权输出到台湾地区,《深入理解Android内核设计思想》诚挚感谢大家一直以来的支持!
  9. ssmWeb开发框架_2014-01
  10. 别真以为JavaScript中func.call/apply/bind是万能的!