meta program (1) swap_iter

开始学习模板元编程了

#include <iostream>
#include <string>
#include <vector>
#include <list>

#include "boost/assign/list_of.hpp"
#include "boost/type_traits/is_const.hpp"
#include "boost/type_traits/is_reference.hpp"
#include "boost/type_traits/is_same.hpp"

#include "boost/shared_ptr.hpp"

namespace swap_test
{
	template<bool use_swap> struct use_swap_impl;

	template<typename ForwardIterator1, typename ForwardIterator2>
	static void swap_iter(ForwardIterator1& i1, ForwardIterator2& i2)
	{
		typedef std::iterator_traits<ForwardIterator1> trait1;
		typedef typename trait1::value_type v1;
		typedef typename trait1::reference r1;

		typedef std::iterator_traits<ForwardIterator2> trait2;
		typedef typename trait2::value_type v2;
		typedef typename trait2::reference r2;

		bool const use_swap = boost::is_same<v1, v2>::value
			&& boost::is_reference<r1>::value
			&& boost::is_reference<r2>::value;//防止代理引用vector<bool>的迭代器,见mpl page30.

		use_swap_impl<use_swap>::to_do_swap(i1, i2);
	}

	template<>//两种类型是一样的,
	struct use_swap_impl<true>
	{
		template<typename ForwardIterator1, typename ForwardIterator2>
		static void to_do_swap(ForwardIterator1& i1, ForwardIterator2& i2)
		{
			std::swap(*i1, *i2);
		}
	};

	template<>
	struct use_swap_impl<false>
	{
		template<typename ForwardIterator1, typename ForwardIterator2>
		static void to_do_swap(ForwardIterator1& i1, ForwardIterator2& i2)
		{
			typename std::iterator_traits<ForwardIterator1>::value_type
			tmp = *i1;
			*i1 = *i2;
			*i2 = tmp;
		}
	};

	void fun()
	{
		std::list<std::string> list = boost::assign::list_of("123")("456");
		std::vector<std::string> vec = boost::assign::list_of("789")("013");

		swap_iter(list.begin(), vec.begin());
		std::cout << *(list.begin()) << " " << *(vec.begin()) << std::endl;

		boost::shared_ptr<int> t1(new int(18));
		boost::shared_ptr<float> t2(new float(20.0f));

		int *tt1 = t1.get();
		float *tt2 = t2.get();
		swap_tier(tt1, tt2);
		std::cout << *t1 << " " << *t2 << std::endl;
	}
}

meta program (1) swap_iter

时间: 2024-10-13 21:54:20

meta program (1) swap_iter的相关文章

c++模板元编程一:基本概念

1 基本概念 1.1 meta program 元程序 可以用meta program生成object program, 也可以object program作为数据看待,从而组装出更大的object program 元程序是处理程序的程序,如大家熟悉的编译器.解释器.类型检查器.定理证明器.程序生成器.转换系统和程序分析器等等 1.2 object program 目标程序 目标程序,又称为"目的程序",为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名--

Flink Program Guide (6) -- 窗口 (DataStream API编程指导 -- For Java)

窗口(Window) 本文翻译自文档Windows ----------------------------------- Flink使用窗口的概念,根据element的时间戳或者其他指标,将可能无限的DataStream分割为有限的数据切片(slice).我们在处理无限数据流以及进行聚合element的transformation时需要此种窗口分割. 注意:我们在此文档中讨论的大多是keyed windowing,即window是应用在KeyedStream上的.关键字下的窗口具有一定的优势,

HTML meta refresh 刷新与跳转(重定向)页面

apache做转发使其定义到自己项目的根目录下 修改apache的配置文件httpd.conf: 找到下面一段去掉前面的#号 Include conf/extra/httpd-vhosts.conf 修改httpd-vhosts.conf文件 <VirtualHost *:80>     ServerAdmin [email protected]     DocumentRoot "D:\tomcat\webapps\ceshi"     ServerName www.ce

移动前端不得不了解的HTML5 head 头标签 —— Meta 标签

Meta 标签 meta标签是HTML中head头部的一个辅助性标签,它位于HTML文档头部的 <head> 和 <title> 标记之间,它提供用户不可见的信息.虽然这部分信息用户不可见,但是其作用非常强大,特别是当今的前端开发工作中,设置合适的meta标签可以大大提升网站页面的可用性. 桌面端开发中,meta标签通常用来为搜索引擎优化(SEO)及 robots定义页面主题,或者是定义用户浏览器上的cookie:它可以用于鉴别作者,设定页面格式,标注内容提要和关键字:还可以设置页

探索Asp net core3中的 项目文件、Program.cs和通用host(译)

引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版中是怎样改变的,以及探讨Aspnetcore3.0使用的Api的变化. *** 介绍 .Net core 3.0 会在九月23号的 NET Conf上发布,但现在已经有一个支持的预览版本(Preview 8).最新的预览版本与最终发布版本不可能有太多的变化,所以现在是开始尝试和查看3.0增加的功能的

META标签的设置

㈠定义及用法 ⑴<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. ⑵<meta> 标签位于文档的头部,不包含任何内容.<meta> 标签的属性定义了与文档相关联的名称/值对. ⑶元数据(metadata)是关于数据的信息.元数据总是以名称/值的形式被成对传递的. ⑷典型的情况是,meta 元素被用于规定页面的描述.关键词.文档的作者.最后修改时间以及其他元数据. ⑸元数据可用于浏览器(如何显示内容或

Meta http-equiv属性详解

http-equiv顾名思义,相当于http的文件头作用,它可以向浏览器传回一些有用的信息,以帮助正确和精确地显示网页内容,与之对应的属性值为content,content中的内容其实就是各个参数的变量值. 引用 meat标签的http-equiv属性语法格式是:<meta http-equiv="参数" content="参数变量值"> :其中http-equiv属性主要有以下几种参数: 1.Expires(期限) 说明:可以用于设定网页的到期时间.一

JSP标签 &lt;meta&gt; 的作用

meta标签: meta标签共有两个属性,它们分别是http-equiv属性和name属性. name 属性 :<meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等:<meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词: <meta name="DEscrip

error: stray &#39;\377&#39; in program

cygwin编译报错:**.cpp:1:1: error: stray '\377' in program解决方法 2014-06-12 00:41 2061人阅读 评论(1) 收藏 举报 编译报错内容: [armeabi] Compile++ thumb: cocos2dcpp_shared <= HelloWorldScene.cpp jni/../../Classes/HelloWorldScene.cpp:1:1: error: stray '\377' in programjni/..