请对C++模板编程精通的朋友帮忙看看下面的代码,目前VC2010下编译通过,Gcc编译失败
请高人帮忙调试解决,使之能够在两个环境下用到这种数据类型。
// 以下代码 Christopher Diggins于2005年1月首次发布
//采用嵌套模板的方法在C++语言中实现了一个变量可以定制承载多种类型的类。
//这个作用和MFC中的VARIANT类似,但更为精炼,且是C++语言级别,因此理论上支持跨平台使用。
//由于近期有这方面的需求,对此做了整理并写了测试代码。
//cq:revised 2016-03-19
//union_list.h开始
struct ul_end {
const int TypeIndex() { return 0; }
};
template<typename Head_T, typename Tail_T, int N>
struct TypeList {
typedef typename TypeList<
typename Tail_T::H_T,
typename Tail_T::T_T,
N - 1>::type
type;
};
template<typename Head_T, typename Tail_T>
struct TypeList<Head_T, Tail_T, 0> {
typedef typename Head_T type;
};
template<typename Head_T, typename Tail_T>
struct ul {
typedef typename ul<Head_T, Tail_T> self;
template<typename T>
ul(T x) : tail(x), tag(false) { }
template<>
ul(Head_T x) : head(x), tag(true) { }
ul(const self& x) : head(x.head), tail(x.tail), tag(x.tag) { }
ul() { };
typedef typename Head_T H_T;
typedef typename Tail_T T_T;
Head_T head;
Tail_T tail;
bool tag;
template<int N>
typename TypeList<Head_T, Tail_T, N>::type& Get()
{
if (N != TypeIndex()) {
throw 0;
}
return *(TypeList<Head_T, Tail_T, N>::type*)InternalGet<N>();
};
template<int N>
void* InternalGet()
{
return tail.InternalGet<N-1>();
};
template<>
void* InternalGet<0>()
{
return &head;
};
const int TypeIndex()
{
return tag ? 0 : tail.TypeIndex() + 1;
}
};
//union_list.h结尾
//test.cpp 开始
/************************************************************************/
/* 使用样例代码 优点是不需要C++11,VC2010通过/GCC不通过 */
#include "union_list.h" //测试一个变量容纳多种数据类型
#include <string>
#include <iostream>
using namespace std;
typedef ul<int,ul<char,ul<bool,ul<double,ul<string,ul<const char*,ul_end>>>>>> test_type;
void output(test_type x)
{
switch(x.TypeIndex()) {
case 0 : cout << "int : " << x.Get<0>() << endl; break;
case 1 : cout << "char : " << x.Get<1>() << endl; break;
case 2 : cout << "bool : " << x.Get<2>() << endl; break;
case 3 : cout << "float : " << x.Get<3>() << endl; break;
case 4 : cout << "string : " << x.Get<4>() << endl; break;
case 5 : cout << "const char* : " << x.Get<5>() << endl; break;
}
}
void main () {
//测试类型
test_type v1=4345;
output(v1);
test_type v2="china";
output(v2);
output('a');
output(3.141);
output(42);
output(string("Hello world"));
output(true);
}
//test.cpp结尾