让boost.variant支持lambda表达式访问

前言
之前写个过一篇博客叫《浅谈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支持lambda表达式访问的更多相关文章
- 浅谈boost.variant的几种访问方式
前言 variant类型在C++14并没有加入,在cppreference网站上可以看到该类型将会在C++17加入,若想在不支持C++17的编译器上使用variant类型,我们可以通过boost的va ...
- maven编译报错 -source 1.5 中不支持 lambda 表达式
在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错 -source 1.5 中不支持 lambda 表达式,Google找到这篇解决方案,记录一下: 编译时报如下错误: [ERROR ...
- Android 1.7 中不支持 lambda 表达式
Error:(129, 32) 错误: -source 1.7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) lambda expressio ...
- 【Maven】Maven-maven编译报错 -source 1.5 中不支持 lambda 表达式
Maven-maven编译报错 -source 1.5 中不支持 lambda 表达式 maven lambda_百度搜索 maven编译报错 -source 1.5 中不支持 lambda 表达式 ...
- c++ 11和java 8都支持lambda表达式
c++ 11居然都支持lambda表达式了,看了这确实是有必要了. 具体可见http://www.cprogramming.com/c++11/c++11-lambda-closures.html
- maven编译报错 -source 1.7 中不支持 lambda 表达式
Maven项目编译失败: [ERROR] COMPILATION ERROR : [INFO] ---------------------------------------------------- ...
- maven编译报错 -source 1.5 中不支持 lambda 表达式(转)
原文链接:http://blog.csdn.net/kai161/article/details/50379418 在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错 -source ...
- IDEA中打包Spark项目提示Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式
在idea中新建了一Spark的项目,在做项目的编译打包的时候,提示如下错误信息: Error:(, ) java: -source 1.5 中不支持 lambda 表达式 (请使用 -source ...
- IDEA无法编译java8的lambda表达式提示Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式
在idea中新建了一个java8的项目,但是写lambda表达式提示语法错误,提示如下错误信息: Error:(16, 48) java: -source 1.5 中不支持 lambda 表达式 (请 ...
随机推荐
- Objective-C代码学习大纲(6)
2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...
- 安卓EmojiTextView 和EmojiEditText
https://github.com/rockerhieu/emojicon 用法和TextView一样. 发送的时候用UTF-8 String enCodedStatusCode = "& ...
- 转载 hibernate一级缓存和二级缓存的区别
文章来源:http://blog.csdn.net/defonds/article/details/2308972 hibernate一级缓存和二级缓存的区别 缓存是介于应用程序和物理数据源之 ...
- Spring Security OAuth2 授权码模式
背景: 由于业务实现中涉及到接入第三方系统(app接入有赞商城等),所以涉及到第三方系统需要获取用户信息(用户手机号.姓名等),为了保证用户信息的安全和接入方式的统一, 采用Oauth2四种模式之一 ...
- 02.Elasticsearch入门
Elasticsearch支持Http类型的Restful风格API请求,需要打开9200端口.Elasticsearch服务会监听两个端口9200和9300,9200提供Http Restf ...
- 160520、MyBatis的几种批量操作
MyBatis中批量插入 方法一: <insert id="insertbatch" parameterType="Java.util.List"> ...
- Android Studio 使用小技巧和快捷键
Android Studio 使用小技巧和快捷键 Alt+回车 导入包,自己主动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt ...
- javascrpt 页面格式化页面
下面这个页面,格式化javaScript <html> <head> <title>JS格式化工具 </title> <meta http-equ ...
- Keras学习-1
本文基于http://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/提及的知识总结,感谢作者做出的贡献,如有侵权将立即删除 符号计算 ...
- 【Spring Task】定时任务详解实例-@Scheduled
Spring的任务调度,采用注解的形式 spring的配置文件如下,先扫描到任务的类,打开spirng任务的标签 <beans xmlns="http://www.springfram ...