最近有空研究了一下C++0x相关的问题,并且在GCC4.6下用变长参数模板实现元组。
template<typename ... AllTypes>
struct MyTuple;
template<> struct MyTuple<> {};
template<int N, class T>
struct ElementType;
template<typename Head, typename ... Tail>
struct MyTuple<Head,Tail...>
{
MyTuple(Head h, Tail... t)
: tail(t...)
, head(h)
{
}
MyTuple(const MyTuple<Head,Tail...>& t)
: tail(t.tail)
, head(t.head)
{
}
MyTuple(MyTuple<Head,Tail...>&& t)
: tail(t.tail)
, head(t.head)
{
}
MyTuple<Tail...> tail;
Head head;
typedef Head HeadType;
typedef MyTuple<Tail...> TailType;
};
//获取元组指定元素的值
template <int k>
struct get_class {
template <typename Head, typename ... Tail>
static typename ElementType<k,MyTuple<Head,Tail...> >::type& get(MyTuple<Head,Tail...>& t )
{
return get_class<k-1>::get(t.tail);
}
template <typename Head, typename ... Tail>
static const typename ElementType<k,MyTuple<Head,Tail...> >::type& get(const MyTuple<Head,Tail...>& t )
{
return get_class<k-1>::get(t.tail);
}
};
template <>
struct get_class<0> {
template <typename Head, typename ... Tail>
static typename MyTuple<Head,Tail...>::HeadType& get(MyTuple<Head,Tail...>& t )
{
return t.head;
}
template <typename Head, typename ... Tail>
static const typename MyTuple<Head,Tail...>::HeadType& get(const MyTuple<Head,Tail...>& t )
{
return t.head;
}
};
//推导元组指定元素的类型
template<int N, class T>
struct ElementType
{
private:
typedef typename T::TailType Next;
public:
typedef typename ElementType<N-1, Next>::type type;
};
template<class T>
struct ElementType<0, T>
{
typedef typename T::HeadType type;
};
template < int k,typename Head, typename ... Tail>
typename ElementType<k,MyTuple<Head,Tail...> >::type& get(MyTuple<Head,Tail...>& t)
{
return get_class<k>::get(t);
}
template < int k,typename Head, typename ... Tail>
const typename ElementType<k,MyTuple<Head,Tail...> >::type& get(const MyTuple<Head,Tail...>& t)
{
return get_class<k>::get(t);
}
使用方式:
MyTuple<double,int,double,int,string,const char*> t(2.1,0,1.11,6666,"helloworld z","world");
cout << get<0>(t) << get<1>(t) << get<2>(t) << get<3>(t) << get<4>(t) << get<5>(t) << std::endl;
get<0>(t) = 100;
get<1>(t) = 10;
get<4>(t) = "gg world";
const MyTuple<int,int,double,int,string> tc(0,0,111.1,5555,"helloworld");
cout << get<0>(tc) << get<1>(tc) << get<2>(tc) << get<3>(tc) << get<4>(tc) << std::endl;
cout << get<1>( MyTuple<double,char>(3.1415926,'c')) << std::endl;
分享到:
相关推荐
调用时提供默认值参数值时,使用提供的值,否则使用默认值。 2.Python可以根据参数名传参数 复制代码 代码如下: def foo(ip,port): print “%s:%d” % (ip,port) foo(“192.168.1.0”,3306) #192.168.1.0
C++元组知识点整理,帮你尽快理解元组
python学习笔记,包含python列表-可变和不可变类型-元组-列表与元组的速度比较
主要介绍了Python从函数参数类型引出元组,结合实例形式分析了Python函数定义与使用中常见的三种参数类型,并简单分析了元组类型参数的使用,需要的朋友可以参考下
Swift视频教程:函数篇 形式参数与返回值④可选元组返回
内容概要: Java可变参数(Varargs)是一种语言特性...通过使用可变参数,开发者可以更简洁地编写方法,无需重载多个方法来处理不同数量的参数。该特性提供了更灵活的方法设计和调用方式,提高了代码的可读性和维护性。
主要介绍了Python实现将元组中的元素作为参数传入函数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
元组和列表操作类似,但是元组属于不可变序列,元组创建后只可以元素覆盖不可以修改元素。元组的定义方式和列表相同,但定义时所有元素是放在一对圆括号“( )”中,用逗号“,”分隔元素值。 元组 实例:体会元组中的...
Python列表、元组、集合、字典的区别和相互转换 - CSDN博客原 Python列表、元组、集合、字典的区别和相互转换2017年04月28日 11:40:0
通过学习python,会发现python的语法真的很强大,如果用c++的思维写python会变的很复杂,在python中有很多方法可以直接使用,不必再去写好几行代码去实现,这就是python的智能之处吧。 这篇帖子呢 列表 python中的...
Objective-C Tuple,OC实现的元组
列表和原组;列表(list)是包含0个或多个元素的有序序列,属于序列类型。 列表的长度和内容都是可变的,可自由对...tuple()函数的功能是以一个序列为参数,并把它转换为元组,如果参数本身是元组,则原样返回该参数。
RSpace 是使用 RESTful Web 服务的元组空间的轻量级和灵活实现。 元组空间的现有实现(例如 Javaspaces)有很多限制。 Javaspaces 只能通过 Java 访问,并且依赖于 Jini 使其复杂、缓慢且难以部署。 该项目的创建...
C# 7.0已经出来一段时间了,大家都知道新特性里面有个对元组的优化:ValueTuple。这里利用详尽的例子详解Tuple VS ValueTuple(元组类VS值元组),10分钟让你更了解ValueTuple的好处和用法。 如果您对Tuple足够了解...
本篇文档中介绍了列表与元组的通用序列操作以及列表的基础操作,还有关于分片的详解(全中文注释适合初学者以及不太懂英语的看)
tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多细节,要揭开
rest参数和扩展运算符都是ES6新增的特性。下面这篇文章主要给大家介绍了关于ES6中rest参数与扩展运算符的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
python 元组的定义和使用 示例
了解几个简单的构造函数,如何修改元组,访问元组,遍历元组,了解元组的内置函数,len(),计算元组个数,元组的最大、最小值,tuple()将列表转化成元组