VC6不支持typedef中递归。终于找到了Tuple的实现方案。
2008-09-18 22:21
399 查看
众所周知,VC6对Templates的支持非常差,但是由于工作需要,我还是希望能够在VC6上实现一个Tuple,这个好像比实现remove_reference还难了(boost好像也没有实现一个VC6下可运行的Tuple),因为Tuple的实现中用到typedef的递归,这种方式VC6会出现死循环。我做了一个简化的测试工程,请高手帮忙看看有没有好的办法绕过这个问题?多谢!
代码如下:(如果用enum部分进行递归,VC6下能正确运行)
#include <iostream.h>
template <typename T, int n>
struct Get
{
template <int unused>
struct GetInner
{
//enum { Value = Get<T, n+1>::Value};
typedef Get<T, n+1>::Type Type;
};
template <>
struct GetInner<2>
{
//enum { Value = 100};
typedef int Type;
};
//enum { Value = GetInner<n>::Value};
typedef GetInner<n>::Type Type;
};
int main()
{
//cout << Get<int, 0>::Value <<endl;
typedef Get<int, 0>::Type TmpType;
cout << typeid(TmpType).name() <<endl;
return 0;
}
借鉴了boost的一段代码,解决了VC6下实现Tuple的问题:
注释掉的部分是原来有问题的实现,为何boost的解决方案可行,还没来得及仔细研究,如果您知道,请告诉我:)
/*
template<
typename Typelist,
int Index, //requested element index
int Step = 0, //current recusion step
bool Stop=(Index==Step), //stop recusion flag
bool OutOfRange = Length<Typelist>::Value==0 //out of range flag
>
struct Get
{
template<bool unused1, bool unused2>
struct GetInner
{
typedef typename Get<typename Typelist::tail, Index, Step+1>::Type Type;
};
// found
template<>
struct GetInner<true, false>
{
typedef typename Typelist::head Type;
};
// found
template<>
struct GetInner<true, true>
{
typedef typename Typelist::head Type;
};
template<>
struct GetInner<false, true>
{
//if OutOfRange is 'true' the 'type' is undefined
//so we'll get a compile-time error
};
typedef GetInner<Stop, OutOfRange>::Type Type;
};
*/
// Workaround the lack of partial specialization in some compilers
template<int N>
struct _element_type
{
template<typename Tuplelist>
struct inner
{
private:
typedef typename Tuplelist::tail tail;
typedef _element_type<N-1> next_elt_type;
public:
typedef typename _element_type<N-1>::template inner<tail>::RET RET;
};
};
template<>
struct _element_type<0>
{
template<typename Tuplelist>
struct inner
{
typedef typename Tuplelist::head RET;
};
};
// Return the Nth type of the given Tuple
template<typename Tuplelist, int N>
struct Get
{
private:
typedef _element_type<N> nth_type;
public:
typedef typename nth_type::template inner<Tuplelist>::RET RET;
typedef RET Type;
};
代码如下:(如果用enum部分进行递归,VC6下能正确运行)
#include <iostream.h>
template <typename T, int n>
struct Get
{
template <int unused>
struct GetInner
{
//enum { Value = Get<T, n+1>::Value};
typedef Get<T, n+1>::Type Type;
};
template <>
struct GetInner<2>
{
//enum { Value = 100};
typedef int Type;
};
//enum { Value = GetInner<n>::Value};
typedef GetInner<n>::Type Type;
};
int main()
{
//cout << Get<int, 0>::Value <<endl;
typedef Get<int, 0>::Type TmpType;
cout << typeid(TmpType).name() <<endl;
return 0;
}
借鉴了boost的一段代码,解决了VC6下实现Tuple的问题:
注释掉的部分是原来有问题的实现,为何boost的解决方案可行,还没来得及仔细研究,如果您知道,请告诉我:)
/*
template<
typename Typelist,
int Index, //requested element index
int Step = 0, //current recusion step
bool Stop=(Index==Step), //stop recusion flag
bool OutOfRange = Length<Typelist>::Value==0 //out of range flag
>
struct Get
{
template<bool unused1, bool unused2>
struct GetInner
{
typedef typename Get<typename Typelist::tail, Index, Step+1>::Type Type;
};
// found
template<>
struct GetInner<true, false>
{
typedef typename Typelist::head Type;
};
// found
template<>
struct GetInner<true, true>
{
typedef typename Typelist::head Type;
};
template<>
struct GetInner<false, true>
{
//if OutOfRange is 'true' the 'type' is undefined
//so we'll get a compile-time error
};
typedef GetInner<Stop, OutOfRange>::Type Type;
};
*/
// Workaround the lack of partial specialization in some compilers
template<int N>
struct _element_type
{
template<typename Tuplelist>
struct inner
{
private:
typedef typename Tuplelist::tail tail;
typedef _element_type<N-1> next_elt_type;
public:
typedef typename _element_type<N-1>::template inner<tail>::RET RET;
};
};
template<>
struct _element_type<0>
{
template<typename Tuplelist>
struct inner
{
typedef typename Tuplelist::head RET;
};
};
// Return the Nth type of the given Tuple
template<typename Tuplelist, int N>
struct Get
{
private:
typedef _element_type<N> nth_type;
public:
typedef typename nth_type::template inner<Tuplelist>::RET RET;
typedef RET Type;
};
相关文章推荐
- java实现树的节点之间距离;向下递归,注意找到一个满足条件的节点要break
- 【转】GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)
- VC6不支持模板函数在cpp文件中的实现
- 软件系统多语言实现方案(重点介绍VB.net利用微软的国际化支持实现软件系统多语言)
- 关于VC6IDE的class view的问题(Go To Definition不能找到定义(实现))
- VC6不支持模板函数在cpp文件中的实现
- [置顶] 终于找到不走全局proxy方案
- b/s系统多语言支持实现方案
- 数据分析,数据挖掘.找了好久终于找到合适的方案
- php实现的递归提成方案实例
- python实现的ftp自动上传下载程序(支持目录递归操作)----转
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案
- CStdioFile实现完美支持UNICODE方案
- 支持多浏览器“复制到剪切板”Zero Clipboard方案实现
- 【原创】无限分级Repeater递归实现:读取一次数据库,使用LINQ2SQL技术,支持排序&显示隐藏
- JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档
- 9.9递归和动态规划(七)——实现许多图片编辑软件都支持的“填充颜色”功能
- MapX中文版——MapX实现中文标注总是报错,终于找到原因。
- 终于实现了网页在线截屏,没有插件,支持长网页和多种格式
- 一个轻客户端,多语言支持,去中心化,自动负载,可扩展的实时数据写服务的实现方案讨论