前言

之前写个过一篇博客叫《浅谈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. UE4关于编译配置的参考(Debug,DebugGame,Development,Shipping,Test等)

    https://docs.unrealengine.com/latest/CHN/Programming/Development/BuildConfigurations/index.html 编译配置 ...

  2. iOS UIWebView 获取内容实际高度,关闭滚动效果

    本文转载至 http://my.oschina.net/Khiyuan/blog/341535   iOS UIWebView 获取内容实际高度,关闭滚动效果 近期做东西,将 UIWebView 嵌套 ...

  3. Android 调用系统相机拍照保存以及调用系统相册的方法

    系统已经有的东西,如果我们没有新的需求的话,直接调用是最直接的.下面讲讲调用系统相机拍照并保存图片和如何调用系统相册的方法. 首先看看调用系统相机的核心方法: Intent camera = new ...

  4. 常用SEO优化技巧

    SEO是指搜索引擎优化 搜索引擎优化是一种利用搜索引擎的搜索规则来提高目前网站在有关搜索引擎内的自然排名的方式.SEO的目的理解是:为网站提供生态式的自我营销解决方案,让网站在行业内占据领先地位,从而 ...

  5. CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器

    CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...

  6. Tips-Windows 10【多桌面视窗】操作

    Windows 10[多桌面视窗] 当你点击任务栏上的“task view”按键时,会在屏幕中间显示你当前正在使用的桌面,你可以点击“添加桌面”来创建一个新的桌面,在这个新的桌面你可以打开其他的应用程 ...

  7. 报错分析---->jsp自定义标签:Unable to load tag handler class

    Unable to load tag handler class 无法加载标签处理程序类 处理自定义标签的类中如下: 调用自定义标签的jsp中如下:

  8. Exchange Database Status(Copy Status ,Content Index State,QueueLength,Move Status...)

    Copy Status Description Mounted The active copy is online and accepting client connections. Only the ...

  9. git学习(6)多人协作

    git学习(6)多人协作 当我们从远程仓库克隆的时候,git会自动的把本地的master和远程的master对应起来,并且远程仓库的默认名称是origin 查看远程库的信息 $ git remote ...

  10. Yii框架2.0的Gii

    Yii框架的Gii在我看来算是个快速创建器,当然对于学习来说意义不大,但对于已经懂得他的原理并用他开发的话,就是个快速开发的好工具. 他能快速的创建控制器,模块,crup,插件,Module. 打开g ...