前言

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

让boost.variant支持lambda表达式访问的更多相关文章

  1. 浅谈boost.variant的几种访问方式

    前言 variant类型在C++14并没有加入,在cppreference网站上可以看到该类型将会在C++17加入,若想在不支持C++17的编译器上使用variant类型,我们可以通过boost的va ...

  2. maven编译报错 -source 1.5 中不支持 lambda 表达式

    在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错  -source 1.5 中不支持 lambda 表达式,Google找到这篇解决方案,记录一下: 编译时报如下错误: [ERROR ...

  3. Android 1.7 中不支持 lambda 表达式

    Error:(129, 32) 错误: -source 1.7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) lambda expressio ...

  4. 【Maven】Maven-maven编译报错 -source 1.5 中不支持 lambda 表达式

    Maven-maven编译报错 -source 1.5 中不支持 lambda 表达式 maven lambda_百度搜索 maven编译报错 -source 1.5 中不支持 lambda 表达式 ...

  5. c++ 11和java 8都支持lambda表达式

    c++ 11居然都支持lambda表达式了,看了这确实是有必要了. 具体可见http://www.cprogramming.com/c++11/c++11-lambda-closures.html

  6. maven编译报错 -source 1.7 中不支持 lambda 表达式

    Maven项目编译失败: [ERROR] COMPILATION ERROR : [INFO] ---------------------------------------------------- ...

  7. maven编译报错 -source 1.5 中不支持 lambda 表达式(转)

    原文链接:http://blog.csdn.net/kai161/article/details/50379418 在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错  -source ...

  8. IDEA中打包Spark项目提示Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式

    在idea中新建了一Spark的项目,在做项目的编译打包的时候,提示如下错误信息: Error:(, ) java: -source 1.5 中不支持 lambda 表达式 (请使用 -source ...

  9. IDEA无法编译java8的lambda表达式提示Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式

    在idea中新建了一个java8的项目,但是写lambda表达式提示语法错误,提示如下错误信息: Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式 (请 ...

随机推荐

  1. Objective-C代码学习大纲(6)

    2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...

  2. 安卓EmojiTextView 和EmojiEditText

    https://github.com/rockerhieu/emojicon 用法和TextView一样. 发送的时候用UTF-8 String enCodedStatusCode = "& ...

  3. 转载 hibernate一级缓存和二级缓存的区别

    文章来源:http://blog.csdn.net/defonds/article/details/2308972     hibernate一级缓存和二级缓存的区别 缓存是介于应用程序和物理数据源之 ...

  4. Spring Security OAuth2 授权码模式

     背景: 由于业务实现中涉及到接入第三方系统(app接入有赞商城等),所以涉及到第三方系统需要获取用户信息(用户手机号.姓名等),为了保证用户信息的安全和接入方式的统一, 采用Oauth2四种模式之一 ...

  5. 02.Elasticsearch入门

        Elasticsearch支持Http类型的Restful风格API请求,需要打开9200端口.Elasticsearch服务会监听两个端口9200和9300,9200提供Http Restf ...

  6. 160520、MyBatis的几种批量操作

    MyBatis中批量插入 方法一: <insert id="insertbatch" parameterType="Java.util.List"> ...

  7. Android Studio 使用小技巧和快捷键

    Android Studio 使用小技巧和快捷键 Alt+回车 导入包,自己主动修正 Ctrl+N   查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L  格式化代码 Ctrl+Alt ...

  8. javascrpt 页面格式化页面

    下面这个页面,格式化javaScript <html> <head> <title>JS格式化工具 </title> <meta http-equ ...

  9. Keras学习-1

    本文基于http://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/提及的知识总结,感谢作者做出的贡献,如有侵权将立即删除 符号计算 ...

  10. 【Spring Task】定时任务详解实例-@Scheduled

    Spring的任务调度,采用注解的形式 spring的配置文件如下,先扫描到任务的类,打开spirng任务的标签 <beans xmlns="http://www.springfram ...