求模板高手帮我实现C++语言级type_list的GCC编译

首页 论坛 社区服务 求模板高手帮我实现C++语言级type_list的GCC编译

标签: , ,

该话题包含 2 个回复,有 2 个参与人,并且由  hsky1 年, 4 月 前 最后一次更新。

正在查看 3 个帖子 - 1 至 3 (共计 3 条)
  • 作者
    帖子
  • #709

    mail863
    参与者

    请对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结尾

    #710

    mail863
    参与者

    上面编码在VC2010下通过编译,个人感觉实现的比较优雅,很喜欢这样精妙小巧的代码,可惜的是GCC下无法通过

    虽然google发现有使用C++11模板实现的相似类型,但因为Windows平台下的开发我们还在使用VC2010,所以C++11等特性不支持,我们也不想使用boost,loki等库,由于还有Linux的使用需要,想恳请高人帮忙基于这段代码做个修改,使其通过GCC。

    #786

    hsky
    参与者

    不算高手,看着编译错误改了改,在Debian gcc 4.7.2上可以编译运行
    test_type定义处的右尖括号之间加上空格,如果编译器版本过低
    union_list.h修改后是下面这个样子

    [/crayon]
    • 该回复由  hsky 于 1 年, 4 月 前 修正。原因: 代码格式调整
    • 该回复由  hsky 于 1 年, 4 月 前 修正。原因: 内容补充
正在查看 3 个帖子 - 1 至 3 (共计 3 条)

抱歉,回复话题必需登录。

Copy Protected by Chetan's WP-Copyprotect.