模板元编程 第二章练习(非答案)

原创 2015年11月19日 20:12:24

2-0.编写一个一元元函数 add_const_ref<T>,如果T是一个引用类型,就返回T,否则返回T const&。编写一个程序来测试你的元函数。提示:可以使用boost::is_same来测试结果。

boost::add_const 对引用没有效果。。

#ifndef ITER_SWAP_H
#define ITER_SWAP_H

#include<iterator>
#include<iostream>
#include<boost\type_traits\add_const.hpp>
#include<boost\type_traits\add_reference.hpp>
#include<boost\type_traits\is_reference.hpp>


template<bool,class T>
struct doit{
	typename typedef T type;
};

template<class T>
struct doit<true,T>{
	typename typedef T type;
};


template<class T>
struct doit<false,T>{
	typename typedef boost::add_const<T>::type type1;
	typename typedef boost::add_reference<type1>::type type;
};

template<class T>
struct add_const_ref
{				  
	static const bool isR = boost::is_reference<T>::value;
	typename typedef doit<isR,T>::type type;
};


#endif

2-1. 编写一个三元元函数replace_type,它接收一个任意的复合类型c作为其第一个参数,

  并将c中出现的所有type x替换为y

#pragma once


#include<iterator>
#include<boost\type_traits\add_const.hpp>
#include<boost\type_traits\add_reference.hpp>
#include<boost\type_traits\is_reference.hpp>
#include<boost\type_traits\is_same.hpp>

template<class A,class B,class C>
struct replace_type;

template<class A,class B,class C,bool>
struct replace_type_imp
{
	typename typedef C type;
};

template<class A,class B,class C>
struct replace_type_imp<A,B,C,false>
{
	typename typedef A type;
};

template<class A,class B,class C,int n>
struct replace_type_imp<A[n],B,C,false>
{
	typename typedef replace_type<A,B,C>::type type[n];
};
template<class A,class B,class C>
struct replace_type_imp<A[],B,C,false>
{
	typename typedef replace_type<A,B,C>::type type[];
};
template<class A,class B,class C>
struct replace_type_imp<A&,B,C,false>
{
	typename typedef replace_type<A,B,C>::type& type;
};
template<class A,class B,class C>
struct replace_type_imp<A*,B,C,false>
{
	typename typedef replace_type<A,B,C>::type* type;
};
template<class A,class B,class C>
struct replace_type_imp<A(),B,C,false>
{
	typename typedef replace_type<A,B,C>::type type();
};
template<class A,class B,class C,class arg1>
struct replace_type_imp<A(arg1),B,C,false>
{
	typename typedef replace_type<A,B,C>::type type(typename replace_type<arg1,B,C>::type);
};


template<class A,class B,class C>
struct replace_type
{
	static const bool value=boost::is_same<A,B>::value;
	typename typedef replace_type_imp<A,B,C,value>::type type;
};

2-2

#pragma once
#include<boost\type_traits\is_base_and_derived.hpp>
#include<assert.h>


template<class base,class derived>
struct polymorphic_downcast_imp{
	const static bool value =0;
};


template<class base,class derived>
struct polymorphic_downcast_imp<base,derived&>
{
	const static bool value = boost::is_base_and_derived<base,derived>::value;
};
template<class base,class derived>
struct polymorphic_downcast_imp<base*,derived*>
{
	const static bool value = boost::is_base_and_derived<base,derived>::value;
};




template<class derived,class base>
derived polymorphic_downcast(base x){
	const static bool value = polymorphic_downcast_imp<base,derived>::value;
	assert(value);
	return static_cast<derived>(x);
}


2-3,少了一个const;

#pragma once
#include<string>
using std::string;


template<class T>
struct type_descriptor_imp
{
	static const string value;
};
template<class T>
const string type_descriptor_imp<T>::value="unknow";
template<>
const string type_descriptor_imp<int>::value="int";
template<>
const string type_descriptor_imp<short int>::value="short int";
template<>
const string type_descriptor_imp<char>::value="char";
template<>
const string type_descriptor_imp<long int>::value="long int";

template<class T>
struct type_descriptor
{
	operator const char* (){
		static string ret;
		ret = type_descriptor_imp<T>::value;
		return ret.c_str();
	}
};
template<class T>
struct type_descriptor<T&>
{
	operator const char* (){
		static string ret;
		ret = type_descriptor_imp<T>::value;
		ret+="&";
		return ret.c_str();
	}
};


template<class T>
struct type_descriptor<T[]>
{
	operator const char* (){
		string ret;
		ret = type_descriptor_imp<T>::value;
		ret+="[]\0";
		return ret.c_str();
	}
};

template<class T>
struct type_descriptor<T*>
{
	operator const char* (){
		static string ret;
		ret = type_descriptor_imp<T>::value;
		ret+="*";
		return ret.c_str();
	}
};



template<class T,class arg>
struct type_descriptor<T(*)(arg)>
{
	operator const char* (){
		static string ret;
		ret = type_descriptor<T>();
		ret+="(*)(";
		ret+=type_descriptor<arg>();
		ret+=")";
		return ret.c_str();
	}
};
template<class T>
struct type_descriptor<T(*)()>
{
	operator const char* (){
		static string ret;
		ret = type_descriptor<T>();
		ret+="(*)()";
		return ret.c_str();
	}
};





《算法导论》第二章-第1节_练习(参考答案)

算法导论(第三版)参考答案:练习2.1-1,练习2.1-2,练习2.1-3,练习2.1-4
  • victoryaoyu
  • victoryaoyu
  • 2017年07月16日 13:59
  • 334

《Erlang 程序设计》练习答案 -- 第二章 Erlang 速览

Erlang 资料本来就非常少,我在网上和 git 都没有找到本书答案,所以打算自己写出来。 一来希望能帮到初学的朋友。 二来若答案有问题,望大家能提出来,共同进步^_^ git 地址 P...
  • wwh578867817
  • wwh578867817
  • 2015年11月12日 14:39
  • 920

模板元编程第九章练习(非答案)

9-0 #ifdef NO_MI_EBO templateclass storage; template class storage_imp:private T{ protected: public:...
  • yeqm_
  • yeqm_
  • 2015年12月13日 13:51
  • 216

模板元编程第四章练习(非答案)

4-0 using namespace std; using namespace boost; using namespace mpl::placeholders; template struc...
  • yeqm_
  • yeqm_
  • 2015年11月30日 12:42
  • 161

模板元编程第五章练习(非答案)

“` 5-1 //5-1 template
  • yeqm_
  • yeqm_
  • 2015年12月03日 13:13
  • 149

java编程思想(第四版)第二章练习题-10

//编写一个程序,打印出从命令行获得的三个参数
  • xiao1ni1zi
  • xiao1ni1zi
  • 2014年08月29日 09:58
  • 680

【Java】《Java编程思想》笔记(含练习题答案代码)-第二章 一切都是对象

2.1 用引用操纵对象【String】 遥控器(引用)- 电视机(数据)创建String引用,如果向无对象的引用发送信息会返回一个运行时错误,所以安全的做法是:创建一个引用的同时便进行初始化...
  • u013016525
  • u013016525
  • 2017年03月09日 16:13
  • 401

C#第二章上机题

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin...
  • qq_36074113
  • qq_36074113
  • 2016年12月07日 15:56
  • 407

深入C#数据类型 第二章(课后简答题)

C#中值类型和引用类型的区别       1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的  地址。      2. 值类型存取速度快,引用类型存取...
  • qq_36074150
  • qq_36074150
  • 2017年02月10日 18:33
  • 201

S2_二本第二章深入C#数据类型

值类型              int salaryliuhuan = 7000;             //文杰             int salarywenjie = salary...
  • qq_35854462
  • qq_35854462
  • 2017年02月14日 17:55
  • 90
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模板元编程 第二章练习(非答案)
举报原因:
原因补充:

(最多只允许输入30个字)