c11 模板元编程---斐波那契数列以及求最大数

参考博客:https://www.cnblogs.com/qicosmos/p/4480460.html

#include 
#include 
using namespace std;

//斐波那契数列
template
struct Fibonacci_1
{
	enum { res = Fibonacci_1::res + Fibonacci_1::res };
};
template<>
struct Fibonacci_1<1>
{
	enum {res = 1 };
};
template<>
struct Fibonacci_1<2>
{
	enum {res = 2 };
};


//c11 定义整型数据 - 关键字 integral_constant

template
struct one_type : std::integral_constant{};

//斐波那契数列
template
struct Fibonacci_2 : std::integral_constant::value + Fibonacci_2::value>{};

template<>
struct Fibonacci_2<1> :std::integral_constant{};

template<>
struct Fibonacci_2<2> :std::integral_constant{};




//求取最大的整数
template 
struct IntegerMax_1
{
	//enum{ res };
};

template 
struct IntegerMax_1
{
	enum { res = arg };
};

template 
struct IntegerMax_1
{
	enum{ res = ( arg1 >= arg2 ? IntegerMax_1::res : IntegerMax_1::res) };
};


//c11 定义整型数据 - 关键字 integral_constant

template 
struct IntegerMax_2;

template 
struct IntegerMax_2 : std::integral_constant{};

template 
struct IntegerMax_2
	: std::integral_constant< size_t, arg1 >= arg2 ? IntegerMax_2::value : IntegerMax_2::value >{};

//可变参数模板

//递归方式展开
//通过递归函数展开参数包,需要提供一个参数包展开的函数和一个递归终止函数

void printargs()//递归终止函数-等同于递归出口 即没有参数时的返回
{	
}

template
void printargs(T t)//参数包展开函数
{
	cout << t << endl;
}

template
void printargs(T t,Args... args)
{
	//cout << sizeof...(args) << endl;//sizeof...()获取参数个数
	printargs(t);		//重载调用输出
	printargs(args...); //递归调用自身
}



int getdata(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}
	else
	{
		return getdata(n - 1) + getdata(n - 2);
	}
}
int main()
{
	
	cout << Fibonacci_1<50>::res << endl;
	cout << Fibonacci_2<50>::value << endl;
	
	//cout << getdata(50)<::res << endl;//必须为常量
	cout << IntegerMax_2<10, 13, 15, 16>::value << endl;//必须为常量
	
	//printargs(1,2,3,4,5,6);
	
	cin.get();
	return 0;
}

 

你可能感兴趣的:(c++)