C++元编程——模板容器类

元编程中有时候会需要容器已容纳暂时的数据。已经在模板元编程上卷了一周,结果发现这种编程方式有提高运行效率的作用,但是在编译时间长、执行文件大、编程复杂的缺点下实在是非常鸡肋,除了炫技几乎可以说毫无作用。所以就炫技一下,以下实现了一种支持插入、连接、交换元素的类模板,本意是用来进一步写行列式求值运算的。代码如下:

template
struct container
{
	template
	static constexpr int get_cal = get_cal;

	template
	static constexpr int get_cal = ret;

	template
	static constexpr int get = get_cal;

	static constexpr int size = sizeof...(is);

	template using push_back = container;

	template using push_front = container;

	template
	struct st_push_other_back
	{
		using t_next = push_back < other::template get>;
		using ret = typename t_next::template st_push_other_back::ret;
	};

	template
	struct st_push_other_back
	{
		using ret = container;
	};
	template
	using push_other_back = typename st_push_other_back::ret;

	template
	struct n_cal
	{
		using t_front = typename n_cal::t_front::template push_front;
		using t_after = typename n_cal::t_after;
	};

	template
	struct n_cal<1, top, remains...>
	{
		using t_front = container;
		using t_after = container;
	};

	/* 当is时空的时候短路n_cal运算 */
	template
	struct enable_cal 
	{
		using front = typename n_cal::t_front;
		using after = typename n_cal::t_after;
	};

	template
	struct enable_cal
	{
		using front = container<>;
		using after = container<>;
	};

	template
	using front_n = typename enable_cal::front;

	template
	using after_n = typename enable_cal::after;

	template
	using mid_nm = typename front_n::template after_n;

	template
	struct swap_cal 
	{
		using swap_front = front_n;
		using swap_mid = mid_nm;
		using swap_after = after_n;
		using ret = typename swap_front::template push_back>::template push_other_back::template push_back>::template push_other_back;
	};

	template
	using swap = typename swap_cal::ret;

};

下面采用一个测试程序来验证这种模板的有效性:

/* 生成序列 */
template
struct gen_seq 
{
	using t = typename gen_seq::t;
};

template
struct gen_seq
{
	using t = container;
};

template
using gen_seq_t = typename gen_seq::t;

int main() 
{
	gen_seq_t<10>::push_other_back> k;
	decltype(k)::mid_nm<1, 10>::swap<1,2> j;
	int i = k.get<3>;
	int ik = k.get;
	_getch();
	return 0;
}

通过调试,可以发现k的类型为container<0,1,2,3,4,5,6,7,8,9,0,1>。可见已经将container<0,...,9>和container<0,1>连接了起来。通过get获取到的i等于2,也正确获取对应位置的参数。

你可能感兴趣的:(元编程学习实践,c++,算法,开发语言)